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

1 数组指针和指针数组的区别

对指针数组和数组指针的概念,相信很多C程序员都会混淆。下面通过两个简单的语句来分析一下二者之间的区别,示例代码如下所示:

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

首先,对于语句int*p1[5],因为[]的优先级要比*要高,所以 p1 先与[]结合,构成一个数组的定义,数组名为 p1,而int*修饰的是数组的内容,即数组的每个元素。也就是说,该数组包含 5 个指向 int 类型数据的指针,如图 1 所示,因此,它是一个指针数组。
在这里插入图片描述
其次,对于语句int(*p2)[5]()的优先级比[]高,*号和 p2 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,p2 是一个指针,它指向一个包含 5 个 int 类型数据的数组,如图 2 所示。很显然,它是一个数组指针,数组在这里并没有名字,是个匿名数组。
在这里插入图片描述
由此可见,对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针,数组占多少个字节由数组本身决定;而对数组指针来说,首先它是一个指针,它指向一个数组,也就是说它是指向数组的指针,在 32 位系统下永远占 4 字节,至于它指向的数组占多少字节,这个不能够确定,要看具体情况。

2 数组首地址和数组首元素地址的区别

了解指针数组和数组指针二者之间的区别之后,继续来看下面的示例代码:

int arr[5]={1,2,3,4,5};
int (*p1)[5] = &arr;
/*下面是错误的*/
int (*p2)[5] = arr;

不难看出,在上面的示例代码中,&arr 是指整个数组的首地址,而 arr 是指数组首元素的首地址,虽然所表示的意义不同,但二者之间的值却是相同的。那么问题出来了,既然值是相同的,为什么语句int(*p1)[5]=&arr是正确的,而语句int(*p2)[5]=arr却在有些编译器下运行时会提示错误信息呢(如在 Microsoft Visual Studio 2010 中提示的错误信息为a value of type"int*"cannot be used to initialize an entity of type"int(*)[5]"”)?

其实原因很简单,在 C 语言中,赋值符号“=”号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1 和 p2 都是数组指针,指向的是整个数组。p1 这个定义的“=”号两边的数据类型完全一致,而 p2 这个定义的“=”号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。

C语言数组指针和指针数组详细总结

C语言中的数组指针和指针数组是两个与数组相关的概念,虽然名称相似,但含义和使用方式有所不同。下面是对数组指针和指针数组的详细总结:

一、数组指针(Pointer to an Array):

  1. 数组指针是指向数组的指针变量,可以用来访问数组元素。
  2. 声明一个数组指针时,需要指定指向的数组类型。
  3. 数组指针的声明形式为:类型 (*指针变量名)[数组长度]
  4. 数组指针可以通过指针运算和数组下标来访问数组中的元素。
  5. 数组指针可以指向静态数组或动态分配的数组。

二、指针数组(Array of Pointers):

  1. 指针数组是由指针构成的数组,每个元素都是指向某种类型的指针。
  2. 声明一个指针数组时,需要指定指针的类型和数组长度。
  3. 指针数组的声明形式为:类型 *数组名[数组长度]
  4. 指针数组的每个元素都可以指向不同的目标,即可以指向不同的数据或内存位置。
  5. 可以通过数组下标来访问指针数组的元素,并通过解引用操作符*来访问指针指向的目标。

数组指针和指针数组的应用场景:

  1. 数组指针可以用于传递多维数组给函数,通过指针运算和数组下标来访问数组元素。
  2. 指针数组常用于存储多个字符串或指向不同类型对象的指针。
  3. 数组指针和指针数组在动态内存分配和二维数组等场景中具有重要作用。

需要注意的是,在使用数组指针和指针数组时,要注意指针的类型和声明的方式,确保正确的访问和操作数组元素。

总结:
数组指针和指针数组是C语言中与数组相关的概念。数组指针是指向数组的指针变量,可以用来访问数组元素;指针数组是由指针构成的数组,每个元素都是指向某种类型的指针。它们在函数传参、存储多个字符串或指向不同类型对象的指针等场景中具有重要作用。了解和灵活运用数组指针和指针数组能够帮助提高C语言程序的设计和实现效果。

部分内容参考于C语言中文网;一个很不错的编程网站,建议大家多看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘凉~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值