指针数组和数组指针的形式
int *p[3] // 指针数组
int (*p)[3] // 数组指针
指针数组和数组指针的理解
1.指针数组 int *p[3]
首先找到变量p,
(1)先与[]
结合看(因为[]优先级比*高)
,也就是p[3],它是一个大小为3的数组;
(2)再向前看有一个*
,说明这个p数组保存的是指针,且3个元素都是指针;(指针数组因此而得名)
(3)再结合int
,说明每个元素的指针指向的是int类型的整数。
指针数组,它肯定是一个数组,然后联想到这个数组保存的是什么呢,指针数组保存的肯定是指针,且数组的每一个元素都是指针;再联想到,每一个元素(指针)它指向的数是什么呢,看它指向的是什么类型,int *p[3]
指向的是int型,double *p[3]
指向的是double型。
画图示意:
实验验证:
- p是不是一个数组?
- p数组中保存的元素是不是都是指针?
- p数组中每个元素指向的是不是定义的类型(int、double)?
#include <iostream>
int main() {
int a = 10;
int b = 20;
int c = 30;
int* p[3] = { &a,&b,&c }; // 指针数组 验证p就是一个数组
// 验证p数组中的每一个元素都是指针,这里保存的是a,b,c的地址
std::cout << "p[0] = " << p[0] << std::endl;
std::cout << "p[1] = " << p[1] << std::endl;
std::cout << "p[2] = " << p[2] << std::endl;
std::cout << "----------------------------" << std::endl;
// 通过解引用,验证p数组的每个元素指向的内容
std::cout << "*(p[0]) = " << *p[0] << std::endl;
std::cout << "*(p[1]) = " << *(p[1]) << std::endl;
std::cout << "*(p[2]) = " << *(p[2]) << std::endl;
return 0;
}
输出结果:
p[0] = 000000DA7BB9FA34
p[1] = 000000DA7BB9FA54
p[2] = 000000DA7BB9FA74
----------------------------
*(p[0]) = 10
*(p[1]) = 20
*(p[2]) = 30
2. 数组指针 int (*pp)[3]
首先找到pp
(1)由于*pp被括号括起来了,优先级最高,所以pp
是一个指针;
(2)向后看[]
,这个指针指向的是一个数组;所以叫数组指针
(3)结合int
,表示这个指针指向的数组中保存的元素都是int类型的整数。
数组指针,顾名思义就是一个指针,我们就要想,既然是指针,那么它指向的是哪个地址,在这里指向的是一个数组(数组也可以理解成地址或者指针),确定完pp指向的是一个数组之后,就要思考这个数组中保存的是什么样的数据,是int型、double型、还是其他类型。在我看来,数组指针就是一个二级指针,因为是用一个指针pp来保存另一个指针地址(数组)
画图示意:
实验验证:
- pp是不是一个指针?
- pp怎样指向一个数组?
- pp指向的数组中保存的数据是什么类型?
#include <iostream>
int main() {
int arr[3] = { 100,200,300 };
int(*pp)[3] = &arr; // 数组指针 这里说明pp是一个指针
// 数组的首个元素的地址可以表示数组的地址,也可以取引用
std::cout << "&(arr[0]) = " << &(arr[0]) << std::endl;
std::cout << "&arr = " << &arr << std::endl;
std::cout << "----------------------------" << std::endl;
// 验证pp指向数组中的元素类型,通过解引用的方式
std::cout << "*(pp) = " << *(pp) << std::endl; // 对二级指针解引用得到数组的地址
std::cout << "(*(pp))[0] = " << (*(pp))[0] << std::endl; // 注意*(pp)要有括号括起来
std::cout << "(*(pp))[1] = " << (*(pp))[1] << std::endl;
std::cout << "(*(pp))[2] = " << (*(pp))[2] << std::endl;
return 0;
}
输出结果:
&(arr[0]) = 000000C85519F798
&arr = 000000C85519F798
----------------------------
*(pp) = 000000C85519F798
(*(pp))[0] = 100
(*(pp))[1] = 200
(*(pp))[2] = 300
总结
- 指针数组,它是一个数组,数组中保存的都是指针,指针指向的是定义的类型。
- 数组指针,它是一个指针,指针指向的是一个数组,数组中元素的类型也是定义的类型。
- 数组指针可以理解成二级指针,用指针保存指针。