C++指標和陣列的區別(不能混用的情況)
通常情況下,C++中指標和陣列是可以混用的,但是,在編寫字元陣列的全排列的時候,混用卻出了問題,因此,今天特地mark一下,以備日後查詢
這裡整理的,不包括用new開闢的動態陣列
1.陣列一旦宣告,我們就不能再給它賦值,但是我們可以給指標賦值
如下:
5、6行都錯,因為陣列s不能作為左值被賦值
報錯階段:程式會在編譯時報錯
int main(){
char s[]="123";
char p[]="123";
char *t=NULL;
s=t;
s=p;
}
2.用指標定義字串時,指標所指的字串會被理解為常量字串,不能修改。陣列定義的字串則可以修改。
如下:例子中用swap對指標進行修改,比較 s 和 s1 的不同
結果:s1的結果能夠正確輸出,但是程式會在swap交換s的元素時,在i=j這一句掛掉。
原因即為上面所說,指標宣告的字串是常量的。
報錯階段:程式執行時,直接掛掉
void swap(char &i,char &j){ char t=i;i=j;j=t; } int main(){ char *s="1234"; char s1[]="1234"; swap(s1[0],s1[2]); printf("%s\n",s1); swap(s[0],s[2]); printf("%s\n",s); }
在vs上除錯可以看到報錯為:
3.用sizeof運算子可以計算陣列變數的陣列大小,但指標指向陣列時,只能計算出指標本身大小(單位:位元組)
int main(){
char *s="1234567890";
char s1[]="1234567890";
printf("s:%d s1:%d char:%d",sizeof(s),sizeof(s1),sizeof(char));
}
執行結果:s:8 s1:11 char:1
注意,字串的結束符'\0'也被sizeof計算在內,因此字串型別比內容長1,如果是其他基本型別,則sizeof(陣列名)/sizeof(型別名)即為陣列長度。
其他的問題,可以參考這個:
《C專家程式設計》的筆記-指標與陣列的區別
更多的區別,待我有空拜讀了《C專家程式設計》之後,再來解決嘍
ok~暫時就發現了這麼多,拜拜(●'◡'●)
原文:https://www.cnblogs.com/luruiyuan/p/5616379.html
int getsize(int data[])
{
return sizeof(data);
}
int_tmain(int argc,_TCHAR *argv[])
{
int data1[]={1,2,3,4,5};
int size1=sizeof(data1);
int *data2=data1;
int size2=sizeof(data2);
int size3=getsize(data1);
cout<<size1<<size2<<size3<<endl;
}
輸出結果為20,4,4
data1是一個數組,sizeof(data1)是求陣列的大小。整個陣列包含5個整數,一個整數佔有四個位元組,因此共佔有20位元組。data2宣告為指標,儘管他指向了陣列data1的第一個數字,但是他本質仍然是一個指標。在32位系統上,對任意指標求sizeof得到的結果都是4.在把陣列作為函式的引數進行傳遞的時候,陣列就自動退化為同類型的指標。因此,儘管函式getsize的引數data被宣告為陣列,他會退化為指標,size3的結果仍然為4.
---------------------
作者:BridgeMa
來源:CSDN
原文:https://blog.csdn.net/jacoob1024/article/details/79888523
版權宣告:本文為博主原創文章,轉載請附上博文連結!