文章出處

  在C語言中,字符串實際上就是字符數組,在內存中字符串"Shatner"存儲的形式是這樣的

  由于C語言并不知道數組有多長,所以用"\0"表示字符串的結束位置,通過sizeof運算符可以取到字符串在內存中占用多少個字節

 

  同樣的字符串在下面的代碼中獲取的長度卻不一樣,你知道是什么原因么?

#include <stdio.h>

void SayHello(char msg[]){
    printf("msg occupies: %i\n",sizeof(msg));
}

int main(){
    printf("Shatner occupies: %i\n",sizeof("Shatner"));
    char msg[]="Hello C";
    printf("msg occupies: %i\n",sizeof(msg));
    SayHello(msg);
    char* msgp=msg;
    printf("msgp occupies: %i\n",sizeof(msgp));
    return 0;
}

 1 void SayHello(char msg[]){//如果把函數參數聲明為數組,它會被當作指針處理,所以這里的msg其實是指針變量
 2     printf("msg occupies: %i\n",sizeof(msg));//所以sizeof獲取的是指針的長度
 3 }
 4 
 5 int main(){
 6     printf("Shatner occupies: %i\n",sizeof("Shatner"));
 7     char msg[]="Hello C";//計算機會為字符串的每個字符以及結束字符"\0"在棧上分配空間,并把首字符地址和msg關聯起來,
 8     printf("msg occupies: %i\n",sizeof(msg));
 9     SayHello(msg);//數組可以當指針來使用
10     char* msgp=msg;
11     printf("msgp occupies: %i\n",sizeof(msgp));//這里當然也是獲取的是指針的長度
12     return 0;
13 }
代碼解釋

數組與指針的區別

  在上面的代碼中我們也看到sizeof(數組)與sizeof(指針)得到的結果是不同的,sizeof(數組)得的是數組的大小而sizeof(指針)得到的是指針在操作系統中所占的大小(在32位中是4,在64位中是8);

  通過“&”運算符取數組的地址,數組變量取的也是數組本身的地址;指針變量取到的是數組的地址,而通過“&”運算符指針變量取到的是指針變量值存儲的地址(數組地址的地址)

  計算機不會為數組變量分配內存,所以不能將它指向別的地方;但計算機是會為指針變量分配空間的

 


文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()