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


《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])

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM