在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);
通過“&”運算符取數組的地址,數組變量取的也是數組本身的地址;指針變量取到的是數組的地址,而通過“&”運算符指針變量取到的是指針變量值存儲的地址(數組地址的地址)
計算機不會為數組變量分配內存,所以不能將它指向別的地方;但計算機是會為指針變量分配空間的