1、以字串形式出現的,編譯器會在結尾自動新增\0,思考,為什麼?
存在的c語言方法,如strlen(s),計算字串的長度,其中s指標。strlen要計算字串長度,必須知道**是結尾,因此使用\0表示結尾。只有字元陣列才有\0的概念,其它型別(int)的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有strlen這種方法。
那麼問題來了,int陣列如何計算長度呢?如int a1 = ;
使用sizeof(a1)/sizeof(int)。
2、陣列可以在棧上分配,也可以在堆上分配,但必須指定大小。
char a1[100]; //在棧上分配
char* pa = new char[100];// 在堆上分配,返回首元素的位址
3、char a1 = "abc"; 相當於在棧頂分配4個位元組,分別放上a,b,c,\0,等價於char a1 =;
4、char* pa = "abc"; 分析一下就知道,pa是char指標,"abc"是乙個文字字串,顯然型別不吻合,需要適配。可認為編譯器做了下面的事情:在常量區分配4個位元組,分別放上a,b,c,\0,然後把a的位址返回給pa。
注意:文字字串放在常量區,是不可修改的,試圖修改,執行異常。那麼在思考一下,既然右邊是const,而pa並沒有限定為const char*,按道理賦值失敗。為什麼可以成功?
可以認為在c語言中,到處充斥著這樣的**。為了相容,必須允許。但是,我們應該寫const char* pa ="abc"; 這樣的話,試圖修改pa的內容,編譯報錯。
5、char a1 = "abc", 等價於char a1 = ; strlen(a1)等於3,長度不包括\0
假如這樣寫 char a1 = ; strlen(a1)是多少? 答案不確定,因為strlen一直找到\0才認為是結尾。
6、 char a1 = "abc"; 下面的結果分別是什麼?
cout<
7、char* pa = "abc"; 下面的結果分別是什麼?
cout<
8、char a1[5]; 陣列名是個指標常量,不能修改指向。
9、char* pa = "abc"; 可認為pa是個指向常量的指標。
10、下面的結果,違反直覺,按道理第4行,第5行應該輸出位址。但是卻輸出指向的字串。這有一定的合理性,我們列印char指標,往往是要看指向的內容,而不是要看位址是多少。而且cout很容易做到,只要遇到\0就結束。那麼問題來了,我想看位址怎麼辦?使用int強制轉化為位址。
111、char a1="
abc";2
char* pa="
def";3
4 cout/
輸出abc
5 cout/
輸出def
67 cout<
輸出a1位址
8 cout<
輸出pa位址
1char p="
abcde";
2char* p2="
abcde";
34 cout<
陣列大小為6
5 cout<
指標大小為4
67 cout/
長度為5
8 cout/
長度為5
char陣列與char指標
char陣列與char指標 1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他...
char陣列與char指標
1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有st...
char陣列和char指標
在c c 中,指標和陣列在很多地方可以互換使用,這使得我們產生一種錯覺,感覺陣列和指標兩者是完全等價的,事實上陣列和指標是有很大的區別的。1.兩者在含義上的區別。陣列對應著一塊記憶體區域,而指標是指向一塊記憶體區域。其位址和容量在生命期裡不會改變,只有陣列的內容可以改變 而指標卻不同,它指向的記憶體...