char陣列和指標問題

2021-08-26 12:31:44 字數 2043 閱讀 3884

這個問題是c++基礎問題中相當折騰人的乙個,死記硬背解決不了根本問題,記住還是要忘,需要仔細研究其本質。

這兩種方式就是陣列和指標的方式:

char a[6] = "abcde";

char *b = "abcde";

第一行宣告了並初始化了乙個char陣列,第二行是宣告char指標b,指向了常量字串。其中a是陣列的首位址,a和b的位址一定不同。

千萬不能說陣列名是指標,可以用sizeof來否定:

char a="abcde";

cout

<陣列不能被直接複製,所以當陣列名作為函式引數的時候,要麼就是陣列的引用,要麼就是指向第乙個元素的指標,他們的值是相等的。當你對乙個陣列做&的時候,他提取的是指向陣列的指標,然後仍然可以隱式轉換成指向第乙個元素的指標,而且它們的值是相等的。

這樣的**是錯的:

char a[6] = "abcde"

;a[6] = "asdfge"

;

只有宣告裡才能用a[6],這就好比int a[6]=;,但不能再用a[6]=;。應該用a[0]='a';

這樣的**是正確的:

char a="abcde";

char *b;

b = a;

b是指標變數,指向了陣列的首位址。

這樣是錯的:

char *a="abcde";  或者  char a="abcde";

char b[6];

b = a;

實際上是上一種情況的相反,報錯error: incompatible types in assignment of 'char*' to 'char [6]'因為不存在乙個隱式轉換使得 char* 被轉換成 char。這個問題比較關鍵,我們可以把陣列名b理解成乙個常量指標,它不能指向其他位址,但指向的字串可以改變。但是注意只是這麼理解而已,陣列名並不真的是常量指標。同樣的,b++;也是錯的。

從另乙個角度來看,陣列名做函式引數時會退化為指標,這裡沒有退化為指標的條件,所以b不能當指標變數用。

這樣也是錯的:

char a[6];

a = "abcde"

;

a是陣列的首位址,怎麼把字串常量賦給它?

再看這種情況:

char *a, *b;

a = "abcde";

b = "abcde";

a和b的值不一定相同,也就是不一定是同乙個位址,這取決於編譯器的行為。

對於char指標和陣列,以下操作都是可行的。

const

char* p="abcd"; //在常量區,應當加const,否則編譯器會報警

// char p="abcd"; // 在stack

cout

cout

<<&(*p)cout

<<*pcout

<<&pcout

<2

cout

<<*(p+2)cout

<<*p+2

cout

<2]

//p[0]='a'

;

對於陣列char p="abcd";,可以使用p[2],這是因為陣列名在這裡退化為指標,p轉為指向陣列首元素的char*型別。也就是說指標本身就可以用,反而是陣列名需要先轉換為指標才能用。看下面的例子:

int b[5] = ;

int *f=b;

cout

<2]f[2]=0;

cout

<2]cout

<2]

char陣列和char指標

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

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 的陣列沒有這個概念。因為其他...