通常情況下,C++中指針和數組是可以混用的,但是,在編寫字符數組的全排列的時候,混用卻出了問題,因此,今天特地mark一下,以備日后查找
這里整理的,不包括用new開辟的動態數組
1.數組一旦聲明,我們就不能再給它賦值,但是我們可以給指針賦值
如下:
5、6行都錯,因為數組s不能作為左值被賦值
報錯階段:程序會在編譯時報錯
1 int main(){ 2 char s[]="123"; 3 char p[]="123"; 4 char *t=NULL; 5 s=t; 6 s=p; 7 }
2.用指針定義字符串時,指針所指的字符串會被理解為常量字符串,不能修改。數組定義的字符串則可以修改。
如下:例子中用swap對指針進行修改,比較 s 和 s1 的不同
結果:s1的結果能夠正確輸出,但是程序會在swap交換s的元素時,在i=j這一句掛掉。
原因即為上面所說,指針聲明的字符串是常量的。
報錯階段:程序運行時,直接掛掉
1 void swap(char &i,char &j){ 2 char t=i;i=j;j=t; 3 } 4 int main(){ 5 char *s="1234"; 6 char s1[]="1234"; 7 swap(s1[0],s1[2]); 8 printf("%s\n",s1); 9 swap(s[0],s[2]); 10 printf("%s\n",s); 11 }
在vs上調試可以看到報錯為:
3.用sizeof運算符可以計算數組變量的數組大小,但指針指向數組時,只能計算出指針本身大小(單位:字節)
1 int main(){ 2 char *s="1234567890"; 3 char s1[]="1234567890"; 4 printf("s:%d s1:%d char:%d",sizeof(s),sizeof(s1),sizeof(char)); 5 }
運行結果:s:8 s1:11 char:1
注意,字符串的結束符'\0'也被sizeof計算在內,因此字符串類型比內容長1,如果是其他基本類型,則sizeof(數組名)/sizeof(類型名)即為數組長度。
其他的問題,可以參考這個:
《C專家編程》的筆記-指針與數組的區別
更多的區別,待我有空拜讀了《C專家編程》之后,再來解決嘍
ok~暫時就發現了這么多,拜拜(●'◡'●)