序言
数组指针和指针数组这两个概念接触的时候是在大学学习C/C++的时候,因为那个时候编程还没有在大学期间那么火热的情况下,因为都是大学生,从来不知道考虑毕业后的事情(要不怎么说是懵懂的大学生呢),那也是我接触的第二门编程语言(第一门是VB),说真的,老师上课讲的真是一脸懵逼啊,完全不理解,当时以为这是完全两个相同的概念,现在才发现,当时的我是有多么的不理解,哈哈…好了,言归正传,今天我重新拿起来C++,跟大家一起来再次揭开他们的真正面目。
概念
数组指针:
指针指向的元素是数组,我们称其为数组指针指针数组:
数组的元素是指针类型,我们称其为指针数组
格式
数组指针
先给大家看一下基本的定义格式
1. 指向一维数组的指针类型变量:
指向类型(*指针变量名)[常量表达式]…
指向类型其实就是我们说的数据类型,看你的指针是哪个类型的,指针变量名顾名思义就是指针的名字,常量表达式,就是我们所说的数组维数,一维后面就写一个常量表达式,中括号里面是正整数。
2. 只想多维数组的指针类型变量
指向类型(*指针变量名)[常量表达式1][常量表达式2],…
举个栗子:
int (*p1)[5];//定义指向一维数组的指针变量p1
int (*p2)[2][3];//定义指向二维数组的指针变量p2
注意:这里的指针变量名必须括起来,因为[]的优先级高于*号,所以我们要让*号先执行,否则就变成定义数组了。
是不是看的有点懵圈,给大家看个图:
这个是一维数组的含义,很简单,p1的指向类型就是一个有着4个整形元素的一维数组。
这个是二维数组的含义,p2的指向类型就是一个有着12个整形元素的二维数组(3行4列)。
大家要注意的是,数组指针本意上是一个指针,而不是数组,我们记得他是一个指向数组的指针!
指针数组
一样还是先给大家看一下指针数组的基本定义格式
1. 一维指针数组的定义:
指向类型 * 数组名[常量表达式]…
由于[]比 * 的优先级要高,因此先处理[],显然这样看起来就是数组形式。指针书每个元素均是一个“指向类型*”指针类型,即每个元素就是一个指针变量。
2. 多位指针数组的定义:
指向类型 * 数组名[常量表达式1][常量表达式2]…[常量表达式n],…
同样,先给大家举个栗子:
int *p1[5];//一维指针数组p1
int *p2[2][3];//二位指针数组p2
注意:指针数组“int * p[4]”与“int (*p)[4]”;写法差不多,但是意义上却完全不一样,后者是数组指针,大家记住了,别搞反了。
一样,给大家看个图:
这个是指针数组的含义,每个指针元素的值还是一个指针。
初始化
- 数组指针
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//二维数组
int (*p)[4]=a;//指向数组的指针的初始化,a代表数组的第一行的第一个元素
- 指针数组
int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//二维数组
int s[4]={a[0],a[1],a[2],a[3]};//一维指针数组初始化
示例
- 数组指针
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},i,j,(*p)[4]=a;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
cout<<setw(2)<<p[i][j]<<endl;
}
}
return 0;
}
运行结果:
1 2 3 4
5 6 7 8
9 10 11 12
- 指针数组
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//二维数组
int i,j,s[4]={a[0],a[1],a[2],a[3]};//一维指针数组初始化
for(i=0;i<4;i++){
for(j=0;j<4;j++){//s[i]为a[i]的行首地址
cout<<setw(2)<<s[i][j]<<endl;//故s[i][j]等价于a[i][j]
}
}
return 0;
}
运行结果:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
总结
以上就是数组指针和指针数组的对比,两者从名字看仅仅只是名字颠倒着叫,但是其含义却大不相同,理解起来还是有点吃力,不过当你第一遍不理解的时候,再去看第二遍,第二遍不行就第三遍,我相信,铁杵磨成针,你一定会理解的,C/C++基础点其实不难,难点在于后期开发,因为偏于底层,如果大家有兴趣做这方面的工作,还是需要下一番苦心的,好了,说了这么多,如果大家还有什么不懂得欢迎留言讨论