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

    一,首先我们先分析下数组名和数组名取地址的区别。

          我们都知道数组名是数组的首地址,然而对数组名取地址又是什么那?看下面一段程序你就会懂的。

        #include "stdafx.h" 
        #include<stdio.h>
        using namespace std;
        void main()
        {
              int a[5];
              printf("%d ", a);
              printf("%d ", &a);
              printf("%d ", a + 1);
              printf("%d ", &a + 1);
              printf("%d ", &a[0] + 1);
              printf("接下里判断下数组a和&a的字节大小 ");
             printf("%d ", sizeof(a));
             printf("%d ", sizeof(a));
            while (1);
        }

       

       分析:由运行结果可知,数组名a和&a的内存地址相同,我们已经知道a=&a[0],所以有a+1指向数组中下一个元素(即为在首地址2751180基础上加int的字节数4)。

    然而&a代表的不是取常量a的地址,而是取数组的地址。虽然a和&a的内存地址相同,但是他们的意义不相同,前者仅代表数组的首地址,后者代表整个数组的,他的进价单位是整个数组的字节长度(4*5=20),所以&a+1的内存地址为2751200。另外当用sizeof时,由于它是个关键字,而不是函数,所以数组不会自动转换为指针,得到的结果都是数组的长度(4*5=20)。PS:如果是(int)a+1则结果是27511801;

    二,数组指针和指针数组的区别。

       数组指针 int (*Parray)[10]=&arr;首先()优先级比较高,所以Parray是一个指针,指向一个整形的一维数组,数组的长度为10,比如int arr[10]={0,1,2,3,4,5,6,7,8,9};  

       如要将二维数组赋给一指针,应这样赋值:
      int a[3][4];
      int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
      p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
      p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

    所以数组指针也称指向一维数组的指针,亦称行指针。

       指针数组 int *Parray[10]  []优先级高,先与Parray结合成为一个数组,再由int*说明这是一个整型指针数组,它有10个指针类型的数组元素,

  • 相关阅读:
    python_day_5:20180720
    python_day_4:20180719
    2018悦读
    2018生活
    心理画
    js 策略模式
    js 单例模式
    js 模板方法模式
    C语言-数据类型
    js 观察者模式
  • 原文地址:https://www.cnblogs.com/kwdeblog/p/6097362.html
Copyright © 2011-2022 走看看