#include <stdio.h> main() { int a[5] = {1,2,3,4,5}; printf("a=%p\n" , a); printf("a=%p\n" , &a); printf("a=%p\n" , &a+1); int *ptr = (int*)(&a+1); printf("%d %d\n" , *(a+1), *(ptr-1)); }
你們先看如上代碼。而後猜想打印出a的內存地址和&a的內存地址是否同樣?直覺上&a應該是對a這個指向a[0]指針變量取地址,因此猜想結果是不同的。數組
可是,看輸出結果。spa
a=0x7fff8178af30 &a=0x7fff8178af30 &a+1=0x7fff8178af44 2 5
答案是同樣,這個是爲何呢?指針
a | 指向a數組a[0]元素的指針code |
&a | 指向整個a數組的指針 |
其實指向整個a數組的指針固然也是指向整個數組的起始地址也是a[0]。因此a和&a的內存地址指針也是同樣的。雖然他們的內存指針地址是相同的。可是對這兩個指針進行加減表示的含義是不一樣的。blog
a+1 | 指針移動sizeof(int)四個字節 |
&a+1 | 指針移動sizeof(a)二十個個字節 |