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

Posted 月光下的脚步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组名和数组名取地址指针数组和数组指针的区别相关的知识,希望对你有一定的参考价值。

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

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

    #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个指针类型的数组元素,

以上是关于数组名和数组名取地址指针数组和数组指针的区别的主要内容,如果未能解决你的问题,请参考以下文章

C语言数组指针&数组名和数组名数组是首元素地址(两特殊情况)数组指针访问二维数组数组指针的使用。

从编译器角度分析数组名和指针的区别

c/c++数组名和指针区别深入探索

数组和指针,内存之间的关系

二维数组名和二级指针

C语言学习 -- 指针