当前位置:   article > 正文

C/C++:指针数组和数组指针

C/C++:指针数组和数组指针

指针数组和数组指针

指针数组: 即用于存储指针的数组,也就是数组元素都是指针
int *p[n]: []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
数组指针: 即指向数组的指针 。
int (*p)[n]:()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度

一、区别例子:
对指针数组和数组指针的概念,一开始总是混淆。下面通过两个简单的语句来分析一下二者之间的区别,示例代码如下所示:

int *p1[5]int (*p2)[5]
  • 1
  • 2

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

二、小插曲: 继续来看下面的示例代码:

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

在上面的示例代码中,&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 语言中,赋值符号=号两边的数据类型必须是相同的,如果不同,则需要显示或隐式类型转换。在这里,p1p2 都是数组指针,指向的是整个数组。p1 这个定义的=号两边的数据类型完全一致,而 p2 这个定义的=号两边的数据类型就不一致了(左边的类型是指向整个数组的指针,而右边的数据类型是指向单个字符的指针),因此会提示错误信息。

三、如果是二维数组怎么定义数组指针
如要将二维数组赋给一指针,应这样赋值:

int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
 p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
  • 1
  • 2
  • 3
  • 4

所以数组指针也称指向一维数组的指针,亦称行指针。

相关参考
https://blog.csdn.net/xia__mu/article/details/99879877

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法构造者/article/detail/63148
推荐阅读
相关标签
  

闽ICP备14008679号