关于一个指针的题目解析(a,&a,(int*)&a,(int*)((char*)&a + 4))

#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)*10)。但是在这个选项中&a被强制转换成int类型的一个元素指针,这个元素指针指向的就是a[0],所以这个指针往下偏移一个单位,就是a[1]的地址。

对于D选项:把&a被强制转换成char类型的一个元素指针,这个指针是char*类型,之指向一个字节的地址,往下偏移4个单位,就是a[1]的起始地址,再把这个指针强制转换成int类型,就是完全指向a[1]的指针,所以这个也是a[1]的地址。

猜你喜欢

转载自www.cnblogs.com/sanshijvshi/p/10331944.html