1. 程式人生 > >數組和指針(sizeof兩者的關系)

數組和指針(sizeof兩者的關系)

第一個 ann p s 解引用 博客 數組的指針 關系 指向 數組和指針

《c和指針》還有對其他博客的參考

數組很常見,int b[4]中 b[4]是整形,b類型是什麽呢?

正常思考方式,b應該是表示整個數組,但是我們使用數組名字b的過程中,幾乎所有都是一個指針常量,就是數組第一個元素的地址,即&b[0]

但不要以此以為數組和指針是相同的。

只有在兩種場合下,數組名不用指針常量表示,其他都是一個常量指針,也稱為數組的 “退化” 。兩種場合為:

1: sizeof(b)

2: &b

第一種舉例:

1   int b[4] = {0};
2   printf("%d\n",sizeof(b));

輸出結果為16,是整個數組的長度,如果b是常量指針,結果應該是指針地址的長度4,(長度取決於機器)

如果輸出sizeof(b)/sizeof(b[0]) 結果是4

第二種: &b,用指針指向b會出錯

1   int b[4] = {0};
2   int *p=&b

  編譯出錯顯示error: cannot convert ‘int (*)[4]‘ to ’int*‘

  不能把整數數組指針賦值給整數指針,說明&b 產生的是一個指向數組的指針;sizeof(&b)的大小是4 就是指針的大小

  其他情況b是指&b[0] ,例如

  

1 #include<stdio.h>
2
int main() 3 { 4 int b[4] = {4,3,2,1}; 5 printf("%d %d %d\n",*b+1,*(b+1),*b); 6 }

技術分享圖片

  結果是 5 3 4

  *b+1是指 *(&b[0])+1 對首地址指針解引用再加1

  *(b+1) 是指 *(&b[0]+1*sizeof(int)) 指針加1的解引用就是b[1]的值 //( 指針+n 是指針後移n*指針指向的類型字節 最好不要超過數組最後一位)

  *b = *(&b[0])

數組和指針(sizeof兩者的關系)