這個問題是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]/ 0
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 的陣列沒有這個概念。因為其他...