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


    #include <stdio.h>
    
    void main()
    {
        int a[5] = {0};
    
    
        printf("a[1] = 0x%x
    ",&a[1]);
        printf("
    ");
        printf("a[1] = 0x%x
    ",a + sizeof(int));                    //A
        printf("a[1] = 0x%x
    ",&a[0] + 1);                          //B
        printf("a[1] = 0x%x
    ",(int* )&a + 1);                      //C
        printf("a[1] = 0x%x
    ",(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]的地址。

  • 相关阅读:
    吐槽下博客园
    关于爱情
    CCD 驱动 时序理解
    写在博客的第一天
    51单片机最小系统
    swing之登陆功能
    TDSQL | 在整个技术解决方案中HTAP对应的混合交易以及分析系统应该如何实现?
    TDSQL | 深度解读HTAP系统的问题与主义之争
    硬核干货!TDSQL全局一致性读技术详解|
    35w奖金池,腾讯云TDSQL精英挑战赛等你来战!
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/10331944.html
Copyright © 2020-2023  润新知