首页 > 代码库 > 数组名和数组名取地址、指针数组和数组指针的区别

数组名和数组名取地址、指针数组和数组指针的区别

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

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

    #include "stdafx.h" 
    #include<stdio.h>
    using namespace std;
    void main()
    {
          int a[5];
          printf("%d\n", a);
          printf("%d\n", &a);
          printf("%d\n", a + 1);
          printf("%d\n", &a + 1);
          printf("%d\n", &a[0] + 1);
          printf("接下里判断下数组a和&a的字节大小\n");
         printf("%d\n", sizeof(a));
         printf("%d\n", 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个指针类型的数组元素,

数组名和数组名取地址、指针数组和数组指针的区别