【无标题】
指针数组
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类型的量,那数组指针就是,指向一个数组。?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!