【无标题】

发布时间:2023年12月24日

指针数组

int *a[10];

上面这行代码就定义了一个指针数组 -- 就是数组a中存放了十个地址。?

问题:? 那么,如何能够看出是一个指针数组呢??

其实很简单,我们先以一个数组为例:? int a[10];? ?这定义了一个数组a,存储了十个int类型的变量。?

[] 表示定义一个数组, 10 表示有十个数据, int 表示数据的类型。所以就是定义了一个包含十个int类型数据的数组。

再说 int* a[10] : [] 表示定义了一个数组,? 10表示有十个数据, int* 表示数据都是指针类型(也就是用于存放地址), 所以就是定义了一个含有十个指针的指针数组。??

数组指针?

数组指针: 指向一个数组的指针。?

int (*a)[10];

上面的代码,数组指针a就是指向一个数组。?

问题:怎么理解呢??

其实也很简单, 我们上面说到 int a[10] 是定义了一个有10个int型元素的数组。我们在这里可以先将(*a)简单看成一个a,这时就和上面一样了,也是定义了一个有10个int型元素的数组。而*a其实是表示a是一个指针,所以a就是指向含有十个int类型元素的数组。?

还有一种理解就是, int a[10]; 定义一个数组, 其实int [10]就表示了数组的类型(10个存放int的空间),所以我们将int [10]看作一个类型, int (*a)[10] -- 就是定义了 一个int [10]类型的指针a指向一个这样的数组。?

问题: 但是,为什么在定义指针数组时就不需要加小括号呢???

?这是因为*运算符的优先级比[]的优先级要低,

所以如果不加括号表达式从右向左结合,a会先和[]结合,构成数组,然后再和*结合,数组内部存储的为指针。(指针数组)??

如果加上括号,()和 []?运算符的优先级是一样的,这样,a先与*结合构成指针,然后再与[]结合指向一个数组。(数组指针)

下面代码就使用了数组指针。?

#include <iostream>
#include <Windows.h>

int main(void)
{
	// 从一个二维数组中找出最大值
	int nub[3][2] = {
		{22,35},
		{56,78},
		{42,31}
	};
	int max = nub[0][0]; // 存放最大值
	int(*p)[2]; // 定义数组指针

	// 现在有需求我们需要从三个数组中一个一个查找,这样我们需要对单个数组进行处理,就可以定义一个数组
	// 指针指向需要处理的哪个数组,处理完折后再指向下一个。

	//int(*p)[2] = &nub[0]; // nub[0]表示第一个数组,将它的地址赋值给指向它的指针p,nub中有2个元素
    
	// 因为需要遍历所以可以使用循环
	for (int i = 0; i < 3; i++) // 确定遍历哪个数组
	{
		p = &nub[i]; // 将数组的地址赋值给数组指针p
		for (int j = 0; j < 2; j++)  // 遍历p指向的数组找到最大值
		{
			if (max < *(*p+j))
			{
				max = *(*p + j);
			}
		}
	}

	printf("最大值为 %d\n", max);  // 结果得到78

	system("pause");

	return 0;
}

上面代码都比较好理解,说一下我们再比较每一个数组中的值和max的值时,使用?*(*p+j)来获得存放在数组中的值。?

上面代码什么意思呢:??

*好理解,就是间接访问指定的地址。?

p时我们定义的指针数组,它指向一个数组,*p就是我们找到了这个数组。?

那后面是什么意思?

我们定义了一个数组, int a[10]; 会在内存中开辟一片连续的空间,而a在编译之后就变成了这一片连续空间首空间的地址(其实每一个变量,编译之后都会变为一个地址)

所以,就像上面的,我们定义一个数组,开辟一片空间,那么a就是这片内存中第一块内存的地址。

而数组指针, 就是指向数组的指针,这个指针变量中存储着这个数组的首地址。方便我们找到这个数组。

为什么存储的是数组的首地址??

其实从一个数组定义就能看出, int a[10]; a中存放的就是数组的首地址,所以找到一个数组可以通过它的首地址,所以数组指针中存放的是数组的首地址。

找到之后,我们再来看数组的访问, 前面说了a其实就是数组的首地址,我们对地址操作和对指针操作是一样的,

*a可以得到数组的首元素存储的值(因为a就是元素的地址),如果我们像访问首元素后面的元素,就可以使用首元素地址+相应的值(和指针的加法类似)。

所以,p指向数组nub,*p就是得到一个数组类型得值,*p+j 就是找到数组后,给数组的首地址+一个值, 得到数组相应数据的地址。*(*p+j)就是找到这个地址之后,*就可以得到它的值(也就是对数组得访问)。??

问题: 这里可能会有一个疑问,既然p中都存放的是数组的首地址了,为什么*p得到的不是首地址中存放的值??

原因是: 当我们定义一个指针变量时 int *p; 可以通过*p来得到一个int类型的值,而数组指针,我们通过*p得到的自然是一个数组类型的值(一片连续空间),如果想要访问数组内的值,那就得对数组进行访问了。

当然你也可以通过字面意思去理解。?

指针数组:? 例如: int型数组,就是数组中存放着int型数据,指针数组,就是存放指针的数组。?

数组指针:例如:int型指针,就是这个指针指向一个int类型的量,那数组指针就是,指向一个数组。?

文章来源:https://blog.csdn.net/weixin_68026222/article/details/135184532
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。