美文网首页
C语言---数组指针与指针数组

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

作者: 教训小磊 | 来源:发表于2022-04-14 02:09 被阅读0次

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

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

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

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

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

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

      图二 数组指针

    由此可见:

    • 对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;
    • 对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在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\n", p++);
        }
    
        char* p[3] = { "aaa","bbb","ccc" };      //指针数组
        for (int i = 0; i < 3; i++)
        {
            printf("%s\n", p[i]);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C语言---数组指针与指针数组

          本文链接:https://www.haomeiwen.com/subject/ebwzsrtx.html