C/C++ 常見錯誤

1、下面是一段c程序:
void foo(int b[][3])
{
    
++b;
    
b[1][1]=9;
}
void main()
{
   
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
   
foo(a);
   
printf(“%d”,a[2][1]);
}
這段程序的輸出是()

1、C/C++傳遞的數組會退化成指針

2、對於數組指針的++,會根據數組中存儲的內容,調整指針。

b是二維數組,b的類型是int(*)[3],即指向一個容量爲3的一維int數組;++b後b[1][1]實際指向b[2][1]處。

2、對於下面的代碼,說法正確的是____。

char* s1 = "Hello world";
char s2[] = "Hello world";
s1[2] = 'E';     // 1
s2[2] = 'E';     // 2
*(s1 + 2) = 'E';  // 3
*(s2 + 2) = 'E';  // 4

這個涉及到c語言中的內存模型,char *s1 = "hello,world",在內存中s1指針變量存儲在棧區,而“hello,world”存儲在常量區,常量是不能被改變的,所以1,3非法。

3、以下程序的輸出結果爲()
#include <string.h>
#include <stdio.h>

void main()
{
char x[] = "STRING";
x[0] = 0;
x[1] = '\0';
x[2] = '0';
printf("%d %d\n", sizeof(x), strlen(x));
}

1. sizeof()是運算符,其值在編譯時就計算好了,獲得的是所建立的最大對象的字節大小,返回值與對象存儲的內容沒有關係。
2. strlen()是函數,其值需在運行時才能計算出,參數必須是(char*),返回的是字符串的長度,從代表該字符串的第一個地址開始遍歷,知道遇到結束符NULL,返回長度不包括NULL。結束標誌:x[i]=0;    x[i]='\0'。

3. strlen是根據ascii碼爲0的字符來判斷是否結束的,'\0'的ascii碼爲0,是結束符;0本身的值就是0,所以也被看做結束符;注意'0'不能被看作結束符,其ascii碼不爲0.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章