zoukankan      html  css  js  c++  java
  • 数组名和数组名取地址的区别

    #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)
     
  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/liushui-sky/p/7993007.html
Copyright © 2011-2022 走看看