程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言學習004:數組與指針,語言學習004

C語言學習004:數組與指針,語言學習004

編輯:關於C語言

C語言學習004:數組與指針,語言學習004


  在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);

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

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved