討論下面的問題前,我們先用sizeof()和strlen()測char陣列長度:
當我們定義了乙個這樣乙個陣列:
char str[10] = ;
通過sizeof(str)我們可以求得str大小為10個位元組(str記憶體分配空間大小).
通過strlen(),我們可以求的此陣列真實長度,strlen通過是否為』\0』來判斷該字串是否結束.
1.』\0』問題
定義陣列有以下幾種定義方法:
(1) char str[10] = 「hello」;
此時我們只給str陣列前5個元素賦值,剩餘5個元素系統將會自動賦值為』\0』,當賦值個數會小於陣列長度時系統都會自動新增』\0』.
(2)const char *str = 「hello」;
定義了乙個字串,str代表字串首位元素位址,此時系統也會自動在字串末尾新增』\0』.
(3)char str = ;
用此方法定義並初始化乙個陣列系統不會自動新增』\0』.
(4)char str[5] =
此時str的長度剛好==字串長度,此時系統將不會自動新增』\0』,如何陣列長度大於字串長度則會自動新增』\0』.
注意char str[5]="hello"是錯誤的寫法
因為在定義字串時,系統會自動新增』\0』,但是陣列長度 == 字串長度,因此系統無法給字串新增』\0』系統將會報錯.
#include #include int main()
;//用sizeof()為5, strlen()不確定
char str3 = ;//用sizeof()為6,strlen()為5
char str4[5] = ;//用sizeof()為5,用strlen所求結果不確定
const char *str5 = "hello"; //用sizeof()為8(乙個指標在64位機器空間大小為8),strlen()為5
printf("str1:sizeof()=%d strlen()=%d\n",sizeof(str1),strlen(str1));
printf("str2:sizeof()=%d strlen()=%d\n",sizeof(str2),strlen(str2));
printf("str3:sizeof()=%d strlen()=%d\n",sizeof(str3),strlen(str3));
printf("str4:sizeof()=%d strlen()=%d\n",sizeof(str4),strlen(str4));
printf("str5:sizeof()=%d strlen()=%d\n",sizeof(str5),strlen(str5));
}
執行結果如下:
2.const char * 和 char * const
char str1 = "hello";
char str2 = "world";
const char* p = str1;
char* const q = str2;
const char* p表達的是*p為乙個常量,常量不可改變其值,但可以改變指標指向的位址.
char * const p 表達的是指標p為乙個常量,改變指標指向的位址,但可以通過改變該位址內的值,相當於乙個陣列.
//p[1] = 'j';非法,會引起編譯器報錯
p = q;//正確,把q指向的位址賦值給p
//q = p;/錯誤,改變了q的指向位址
q[1] = 'j';//正確,改變該位址內的值
c 指標常量 和 常量指標
指標常量 指向常量的位址,不允許改變指向位址,指向位置的變數值能被改變 p不可以變 const p 常量指標 指向常量的指標,指標指向的物件不能通過這個指標來修改,可是仍然可以通過原來的宣告修改,也就是說量指標可以被 賦值為變數的位址,之所以叫做常量指標,是限制了通過這個指標修改變數的值 cont ...
C 指標常量和常量指標
首先在c 目前我看到的型別宣告方式,該變數的型別都是由最後幾個字來確定,前面是定語,修飾詞。有其他不同的歡迎指出,共同學習 比如 指標陣列 是陣列,陣列裡存的是指標。陣列指標 是指標,指標指向陣列。所以指標常量 首先是常量,然後是乙個指標,即是該指標是乙個常量,指標的值即位址不會變。常量指標 首先是...
C 指標常量 常量指標和常指標常量
1 指標常量 如果在定義指標變數時候,指標變數前用const修飾,被定義的指標變數就變成了乙個指標型別的常變數,指標型別的常變數簡稱為指標常量。格式如下 資料型別 const 指標變數 變數名 修飾符const與指標變數緊鄰,說明指標變數不允許修改,既然指標變數的值不能修改,所以一定要在定義的時候給...