1. 程式人生 > >C++指標和陣列的區別(不能混用的情況)

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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!