C进阶养成记 - 养成记32:数组指针和指针数组

--事物的难度远远低于对事物的恐惧!

    有些天没更新内容了,今天我们就来说说数组指针和指针数组,可能很多人对这两个概念比较混淆,其实也比较简单,首先我们来分析下它们的名称:

    数组指针:首先它是指针,然后指向数组

    指针数组:首先它是数组,然后数组中的元素是指针

    为了比较好的理解上边两句话,我们首先要来了解一下数组类型:

        -C语言中的数组有自己特定的类型

        -数组的类型由元素类型数组大小共同决定

    例如:int array[5]的类型为int[5],而不是int,int只元素的类型。

有了数组类型的概念,我们还知道,在C语言中,可以使用typedef来为一个类型重命名,例如:typedef int INT;就是给int起了个新名字INT。对于使用typedef给重命名一个类型的语句格式,很多人对重命名数组类型或者函数类型比较摸不着脑袋,我来说说我自己的理解,我自己概括为2个步骤:

    第一步:首先用类型定义一个变量,例如:int a;
    第二步:在定义语句前加上typedef关键字,然后把变量名改成你希望的类型名即可,例如:typedef int INT;    

    现在我们来套用下typedef的使用步骤,比方我们给int[5]类型的数组重命名为AINT5:

        第一步:定义一个类型为int[5]的数组,即:int array[5]

        第二步:定义语句前加typedef关键字,然后把变量名array改成重命名的类型名AINT5,即有typedef int(AINT5)[5](注意把括号加上,要不就成了:typedef intAINT5[5],编译器是识别不了这是什么的)

    经过以上两步,我们就可以使用重命名后的数组类型AINT5定义数组了,比方:AINT5 iarray,此时就等同于int iarray[5]。相信你已经理解了,用比较官方的重命名数组就是 : typedef type(name)[size]。

    有了上边的铺垫,我们来进入正题了,数组指针。我们知道,我们之前定义一个只指针,格式为type *pName;就定义了一个指向type类型的指针变量pName。例如:int *p; 同理,定义数组指针就是 AINT5 *pA,还原到原始类型名,就是 int(*pA)[5],这个时候pA就指向了一个元素个数为5,元素类型为int的数组,我们来总结一下:

    -数组指针用于指向一个数组

    -数组名是数组首元素的起始地址,但并不是数组的起始地址

    -将取址地址符&作用于数组名可以得到数组的起始地址

    -可通过数组类型定义数组指针:ArrayType *pointer;

    -也可以直接定义: type(*pointer)[n] (注意[]符的优先级要高于*符,要表明pointer是指针,必须要先与*符结合,所以别忘了加括号,如果写成type* pointer[n],那么pointer就是指针数组,而不是数组指针了)

有了以上的理解,下边来看一段代码,你们觉得执行后会输出什么呢?

#include <stdio.h>

typedef int(*pArray)[5];

int main()
{
    int array[5] = {1,2,3,4,5};

    int(*pA1)[5] = &array;
    pArray pA2 = &array;
    int *p = array;

    printf("(*pA1)[0] = %d\n", (*pA1)[0]);
    printf("(*pA2)[0] = %d\n", (*pA2)[0]);
    printf("p[0] = %d\n", p[0]);

    return 0;
}

好吧,相信你已经知道结果了,我们来执行一下:



说完了数组指针,现在我们来说说指针数组,从名字上看,"指针数组"首先得是数组,再而数组的元素是指针

    -指针数组是一个普通的数组
    -指针数组中每个元素为一个指针
    -指针数组的定义:type* pArray[n](此处pArray会先与[n]结合,原因上文中已经解释过,[]符的优先级要高于*符)

    例如float* a[3];就定义了一个指针数组,数组的元素类型为float*型,在内存中表示形式为:


    下边来段代码理解一下:

#include <stdio.h>

int main()
{
    int array1[5] = {1,2,3,4,5};
    int* array2[5] = {NULL};
    int i=0;

    for (i=0; i<5; i++)
    {
    	array2[i] = (array1 + i);
    }

    for (i=0; i<5; i++)
    {
    	printf( "%d\n", *(array2[i]) );
    }

    return 0;
}

执行输出,比较好理解,就不解释了:


小结:

    -数组的类型由元素类型数组大小共同决定

    -数组指针是一个指针指向对应类型的数组

    -指针数组是一个数组,其中每个元素都为指针
    -数组指针遵循指针运算法则
    -指针数组拥有C语言数组的各种特性





猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/80211784
今日推荐