C语言中数组指针和指针数组

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

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

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

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

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

        -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语言数组的各种特性

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言数组指针指针数组是两种不同的概念。下面我将为您提供一些代码例子来说明它们之间的区别。 1. 指针数组示例: ```c #include <stdio.h> int main() { int a = 10, b = 20, c = 30; int *arr[3]; // 声明一个指针数组 arr[0] = &a; // 数组的第一个元素指向变量a arr[1] = &b; // 数组的第二个元素指向变量b arr[2] = &c; // 数组的第三个元素指向变量c for (int i = 0; i < 3; i++) { printf("arr[%d] = %d\n", i, *arr[i]); // 打印数组元素的值 } return 0; } ``` 输出结果: ``` arr[0] = 10 arr[1] = 20 arr[2] = 30 ``` 在上述代码,我们声明了一个指针数组`arr`,其的每个元素都是一个指向`int`类型的指针。然后,我们将变量`a`、`b`和`c`的地址分别赋给了数组的元素。最后,通过循环遍历数组,并使用解引用操作符`*`来获取数组元素所指向的值。 2. 数组指针示例: ```c #include <stdio.h> int main() { int arr[3] = {10, 20, 30}; int (*ptr)[3]; // 声明一个数组指针 ptr = &arr; // 数组指针指向数组arr的地址 for (int i = 0; i < 3; i++) { printf("(*ptr)[%d] = %d\n", i, (*ptr)[i]); // 通过数组指针访问数组元素的值 } return 0; } ``` 输出结果: ``` (*ptr)[0] = 10 (*ptr)[1] = 20 (*ptr)[2] = 30 ``` 在上述代码,我们声明了一个数组`arr`,并初始化了它的元素。然后,我们声明了一个数组指针`ptr`,并将数组`arr`的地址赋给了它。通过在指针前加上括号,我们可以使用解引用操作符`*`来访问数组元素的值。 总结来说,指针数组是一个数组,其的每个元素都是指针,而数组指针是一个指向数组指针。它们在使用方法和语义上有所区别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值