#include <stdio.h> void main() { int a[5] = {0}; printf("a[1] = 0x%x\n",&a[1]); printf("\n"); printf("a[1] = 0x%x\n",a + sizeof(int)); //A printf("a[1] = 0x%x\n",&a[0] + 1); //B printf("a[1] = 0x%x\n",(int* )&a + 1); //C printf("a[1] = 0x%x\n",(int* )((char*)&a + sizeof(int))); //D }
问,A,B,C,D中那个输出的不是a[1]的地址?
有之前的博客详细的写了关于指针的特性,这就来实战个题目:
对于A选项:首先sizeof(int)在32位机下面结果就是4,a就是数组名,相当于一个指针,也就是元素的指针,a+4就是指针偏移4,所以A选项表示a[4]的地址。
对于B选项:&a[0]和a是一样的,也是一个元素的指针,&a[0] + 1就是指针偏移1,所以B选项表示a[1]的地址。
对于C选项:&a是整个数组的地址,也是数组指针int (*)[ ],如果是&a + 1,就是相当于 (&a这个数值) + (sizeof(int)*5)。但是在这个选项中&a被强制转换成int类型的一个元素指针,这个元素指针指向的就是a[0],所以这个指针往下偏移一个单位,就是a[1]的地址。
对于D选项:把&a被强制转换成char类型的一个元素指针,这个指针是char*类型,之指向一个字节的地址,往下偏移4个单位,就是a[1]的起始地址,再把这个指针强制转换成int类型,就是完全指向a[1]的指针,所以这个也是a[1]的地址。