#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]指針變量取地址,所以猜測結果是不一樣的。
但是,看輸出結果。
a=0x7fff8178af30 &a=0x7fff8178af30 &a+1=0x7fff8178af44 2 5
答案是一樣,這個是為什么呢?
| a | 指向a數組a[0]元素的指針 |
| &a | 指向整個a數組的指針 |
其實指向整個a數組的指針當然也是指向整個數組的起始地址也是a[0]。所以a和&a的內存地址指針也是一樣的。雖然他們的內存指針地址是相同的。但是對這兩個指針進行加減表示的含義是不同的。
| a+1 | 指針移動sizeof(int)四個字節 |
| &a+1 | 指針移動sizeof(a)二十個個字節 |
