C语言—数组指针与指针数组

数组指针和指针数组是两个容易搞混的概念,接下去我们对它们进行一个详细的分析。
第一,理解一下数组指针和指针数组这两个名词:

  • 数组指针:数组的指针,是一个指针,指向数组的指针。
  • 指针数组:指针的数组,是一个数组,装着指针的数组。

然后,先明确一个优先级顺序:()>[]>* ,所以:

  • 数组指针(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”。
  • 指针数组* p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”。

以下面两个示例进行进一步分析

int *p1[5];
int (*p2)[5];

  • int *p1[5] :由于 [] 的优先级高于 * ,所以p1先与 [] 结合,构成一个数组的定义,数组名为p1,而 “int *”修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含5个指向int类型数组的指针,如下图一所示,它是一个指针数组。

    C语言---数组指针与指针数组

  • int (* p2)[5]:()的优先级高于 [ ] ,“ * ”和p2构成一个指针的定义,指针变量名为p2,而int 修饰的是数组的内容,即数组的每个元素。也就是说,p2是一个指针,它指向一个包含5个int类型数据的数组,如图二所示,它是一个数组指针。PS:数组指针也称一维数组的指针,所以数组指针也称行指针,即使用过程中,需要将二维数组的行地址赋给这个指针使用。

    C语言---数组指针与指针数组

由此可见:

  • 对指针数组来说,第一它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;
  • 对数组指针来说,第一它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在32位系统下永远占4个字节,至于它指向的数组占多少字节,这个是不能确定的,要看具体情况。

下面展示两个实际例子:

#include<stdio.h>

int main()
{
    char a[3][20] = { "aaa","bbb","ccc" };   
    char(*p)[20];                             //数组指针
    p = a; // 等于 p=&a[0] 即把二维数组a的 第0行首地址赋给p
    for (int i = 0; i < 3; i++)
    {
        printf("%s
", p++);
    }

    char* p[3] = { "aaa","bbb","ccc" };      //指针数组
    for (int i = 0; i < 3; i++)
    {
        printf("%s
", p[i]);
    }
    return 0;
}

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容