char陣列與char指標

2022-06-16 21:03:10 字數 2714 閱讀 9869

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強制轉化為位址。

1  char a1="abc";

2 char* pa="def";

3 4 cout<

11、1 char p="abcde";

2 char* p2="abcde";

3 4 cout<

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強制轉化為位址。

1 char a1="abc";

2 char* pa="def";

3 4 cout<

11、1 char p="abcde";

2 char* p2="abcde";

3 4 cout<

char陣列與char指標

1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有st...

char陣列與char指標

char陣列與char指標 1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他...

char陣列和char指標

在c c 中,指標和陣列在很多地方可以互換使用,這使得我們產生一種錯覺,感覺陣列和指標兩者是完全等價的,事實上陣列和指標是有很大的區別的。1.兩者在含義上的區別。陣列對應著一塊記憶體區域,而指標是指向一塊記憶體區域。其位址和容量在生命期裡不會改變,只有陣列的內容可以改變 而指標卻不同,它指向的記憶體...