1、多级指针
char *string[10];
在C++中,一维数组的名字string指向存储数据元素的空间的起始地址,也就是指向数组的第一个元素的指针,而在此数组中的每个元素又是一个指针,因此string本身指向了一个存储指针的单元,他被称为指向指针的指针。
普通的数组可以通过指向同类型的指针来访问,同来,指针数组也可以通过指向指针的指针来访问,如下代码:
#include<iostream>
using namespace std;
int main()
{
char **p,*city[]={"aaa","bbb","ccc","ddd","eee"};
for(p=city;p<city+5;p++)
cout<<*p<<endl;
return 0;
}
输出的结果:“aaa” "bbb" .... "eee"
2、多维数组和指向数组的指针
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
#include<iostream>
using namespace std;
int main(void)
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
cout<<a<<a+1<<a+2<<endl;
cout<<*a<<a[0]<<endl;
cout<<*(a+1)<<a[1]<<endl;
cout<<*(*(a+1)+1)<<endl;
return 0;
}
每个a[i]是一个由4个元素组成的一维数组。a[i]可以看成一维数组的数组名,因此a[i]可以看成指向第i行第0个元素的指针,是一个指向整形元素的指针,a[i]+1指向第i行的第1个元素,。。。。数组名a指向由3行组成的一维数组的第0个元素,即a[0]
从一维数组的角度来看,a是a[0]的地址,也就是第0行的首地址,a+1是a[1]的地址,也就是第一行的首地址,依次类推,由此可见,对指针a加1,事实上是调到下一行,在本例中跳过了4个元素,这样的指针称为指向一维数组的指针。
指向一维数组的指针可以这样定义:
类型 (*指针变量名) [元素个数];
二维数组的访问也可以通过指针实现,例如,如果定义
int (*p)[4],*q;
那么,可以通过以下方法输出数组a的所有元素:
for(p=a;p<a+3;p++)
{
for(q=*p;q<p+4;q++)
{
cout<<*q<<'\t';
}
cout<<endl;
}
注意点:
在使用指针访问二维数组时,细心的人会发现,如果输出a和a[0],这两个值是相同的,但是,这两个值的含义是不同的,前者是第0行的首地址,它的类型指向由4个元素组成的一维数组的首地址,后者是第0行第0个元素的地址它的类型是整形指针