zoukankan      html  css  js  c++  java
  • 关于一个指针的题目解析(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]的地址。

  • 相关阅读:
    Java学习之IO之File类一
    Java学习之二分查找算法
    Java学习之国际化程序
    Java学习之自定义异常
    Java学习之开篇—个人随想
    pl/sql 的 put和put_line区别
    Java中static、final用法
    一个包含所有c++的头文件的头文件
    Codeforces Round #379 (Div. 2)
    hdu-5977 Garden of Eden(树分治)
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/10331944.html
Copyright © 2011-2022 走看看