C++多级指针与多维数组详细介绍
多级指针的概念
多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下:
int val=10;
int *ptr=&val;
int **pptr=&ptr;
int ***ppptr=&pptr; //是多少级指针就有多少*号
这里val值为10,*ptr值也为10,**pptr的值和***ppptr的值均为10。注意这里的*号与定义中的*号意义不同,前者是指针说明符,后者是运算符,称间接引用运算符。
【例5.13】多级指针。
#include<iostream>
using namespace std;
int main(){
int val=66;
int *pval = &val;
int **ppval = &pval;
cout<<"val="<<val<<'\n'<<"**ppval="<<**ppval<<'\n';
**ppval=18;
cout<<"val="<<val<<'\n'<<"**ppval="<<**ppval<<endl;
return 0;
}
指针两要素
指向数组(元素)类型的指针,与一维数组名是等效的:
int a[10], *pa =a;
则写pa[0] ,就是a[0];
*pa,即a[0];
*(pa+1) 和pa[1] ,都代表a[1]。
指针有两要素:地址和所指向目标的数据类型。a 与pa 两者都是一样的,所以pa 可以替代a。
二维数组与指针
二维数组是数组元素为一维数组的数组,所以等效的指针类型应该是指向一维数组的指针类型。如有:
int x2d[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*pt)[4]=x2d;
则指针pt和x2d是等效的。它们表示的首地址一样,所指目标类型也一样,pt可以代替x2d,就象pa代替a一样。
指向一维数组的指针的定义如下:
数据类型 (* 指针变量名)[n];
这里数组元素的个数n不可省略。因是指向指针的指针,称二级指针。
【例5.14】用指向二维数组基本元素的指针变量,和用指向组成二维数组的一维数组的指针变量输出二维数组全部基本元素。
#include< iostream>
using namespace std;
int main( ){
int a[3][6]={{1,2,3,4,5,6},{7,8,9,10,11,12},{13,14,15,16,17,18}};
int * ptr,i,j;
ptr=&a[0][0] ; //或 ptr = *a; 而不能ptr = a;
for(i=0;i<18;i++){
cout<<*(ptr+i)<<'\t';
if(i%6==5) cout<<endl;
}
cout<<endl;
int (* ptr1)[6]; //注意 ptr1是指向包含6个整型元素的一维数组的指针
ptr1=a;
for(i=0;i<3;i++){
for(j=0;j<6;j++) cout<<*(*(ptr1+i)+j)<<'\t';
cout<<endl;
}
return 0;
}
用指向数组元素的指针把数组传递到函数里,同时传递行列信息,就可以实现通用性。