• 数组名和数组名取地址的区别


    #include <stdio.h>
    int main()
    {
    int a[5];
    printf("%d ", a);
    printf("%d ", &a);
    printf("%d ", a + 1);
    printf("%d ", &a + 1);
    printf("%d ", &a[0] + 1);
    printf("--------------- ");
    printf("%d ",sizeof(a));
    printf("%d ",sizeof(&a));
    return 0;
    }
    运行结果:

    分析:

        由运行结果可知,数组名a和&a的内存地址相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为1245040,即数组中a[1]的地址是1245040(在首地址1245036基础上加int的字节数4得到的)。
        然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址虽然&a和a的内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*5=20),所以&a+1得内存地址为1245056。
     
       其实,a的类型是int[5]   数组
             &a的类型是int(*)[5]  指针——指向int[5]数组的指针
             &a[0]的类型是int*    指针——指向int类型的指针
    另外,当用sizeof时,由于它是个关键词,而不是个函数,所以数组不自动转换为指针,得到的结果是数组的长度*数组中元素类型所占的字节数,本例中sizeof(a)是20.
    而&a为指针(指向整个数组),所以sizeof(&a)为4 
    ps:如果是(int)a +1,则结果是1245037(即1245036+1)
     
  • 相关阅读:
    Android xml text 预览属性
    GridView、ListView默认的点击背景修改
    java.util.ConcurrentModificationException
    Android 菜单定制使用小结
    Panel 中加载窗体
    git代理配置
    TableLayoutPanel 动态添加 行 列
    C# 左右补零
    Dart Map<> 添加 元素
    Mac 永久添加 环境变量方法
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/7993007.html
Copyright © 2020-2023  润新知