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