/**
* cppTest-3.0:指针相关-2(二维数组&一级指针&二级指针&一维指针数组)
* 总结:
1、设有数组Type[列数]、Type[行数][列数]:
数组变量类型:类型+数组长度表示,如一维数组:Type[列数]。二维数组:Type[行数][列数]。
指针基类型:指针低一维的变量类型。如一维数组指针低一维为元素,即Type。
二维数组指针低一维为行数组,类型为Type[列数]。
2、个人总结*与&的作用(这只是我的理解,有可能是错的!)
//"*"有降级后取内容作用(如a+1表示二维数组,*(a+1)降级为一维数组后取出其中的内容
——即行数组,故*(a+1)==a[1])
//"&"有升级后取地址作用(如a[0]表示行数组,即一维数组,&a[0]升级为二维数组后取出首地址,
故a==&a[0])
3、//一维指针数组即元素为指针的一维数组
//一维指针数组基类型为Type*,故应该用二级指针接收它:(Type*)*,括号可省,即Type**
4、//一维指针数组的元素作为指针变量,可以指向二维数组的行数组
5、//好像二维数组与二级指针之间不能直接转化!需要通过一维指针数组中介~
*author 炜sama
*/
#include<iostream.h>
int whole[2][2];//全局变量的二维数组的元素可以自动获得初值0!
void main()
{
cout<<"数组定义及初始化的问题-----------"<<endl;
int a[2][2]={{0,0},{1,1}};//逐行初始化
int b[][2]={{0,0},{1,1}};//行可省,列不能省
int c[2][2]={0,0,0,0};//可行,不提倡!
int d[2][2]={{0},{1}};//初始化数据不足,系统用0补充
int e[2][2]={0};//这样也可以!全部元素为0!
cout<<d[0][1]<<d[1][1]<<endl;
for(int i=0;i<2;i++){
cout<<e[i][0]<<e[i][1];
}
cout<<endl;
int f[2][2];//自动局部变量未初始化,那每个元素都会是随机值!
static int g[2][2];//静态局部变量的二维数组的元素可以自动获得初值0!
for(int j=0;j<2;j++){
cout<<f[j][0]<<f[j][1];
}
cout<<endl;
for(int k=0;k<2;k++){
cout<<g[k][0]<<g[k][1];
}
cout<<endl;
for(int l=0;l<2;l++){
cout<<whole[l][0]<<whole[l][1];
}
cout<<endl;
cout<<"行指针----------------------------"<<endl;
//行指针用来接收二维数组指针!
//注意与一维指针数组格式的区别!
int (*pa)[2]=a;//这个定义格式可以这样理解:一维数组定义格式--int i[2];,这时i的变量类型为int[2];
//再来,一维指针定义:int *pi=i;,可见,要使pi变为指针则定义时应该在pi前加“*”。
//以此类推,要定义行指针,应该在行指针变量前加“*”,由此推出这个定义格式!
//以下这些定义行指针的格式都是错的!
//int *pa2[2]=a;//错误!!
//int * pa3[2]=a;//错误!!
//int[2] *pa4=a;//错误!!
//int **pa5=a;//错误!
for(int m=0;m<2;m++){
cout<<pa[m][0]<<pa[m][1];
}
cout<<endl;
cout<<"列指针----------------------------"<<endl;
//列指针将二维数组当作一维数组来看待。因为二维数组本身就是一行接一行地地址连续地储存的,所以可以这么做。
//以下3种定义方式等价!
int *pcola=a[0];
int *pcola2=*a;
int *pcola3=&a[0][0];
cout<<"二维数组与一维数组之间的转化-------"<<endl;
//*有降级后取内容作用(我的理解:如a+1表示二维数组,*(a+1)降级为一维数组后取出其中的内容——即行数组,故*(a+1)==a[1])
if(*(a+1)==a[1])
cout<<"*(a+1)==a[1]"<<endl;
//同上
if(*(a[1]+1)==a[1][1])
cout<<"*(a[1]+1)==a[1][1]"<<endl;
//相反,&有升级后取地址作用(我的理解:如a[0]表示行数组,即一维数组,&a[0]升级为二维数组后取出首地址,故a==&a[0])
if(a==&a[0])
cout<<"a==&a[0]"<<endl;
cout<<"一维指针数组与二级指针----"<<endl;
//一维指针数组即元素为指针的一维数组,
char* ca[2];
ca[0]="草泥马";ca[1]="勒戈壁";
char *ca2[2];
char * ca3[2];
char *ca4[2]={"草泥马4","勒戈壁4"};
cout<<ca[0]<<","<<ca[1]<<endl;
//一维指针数组基类型为Type*,故应该用二级指针接收它:(Type*)*,括号可省,即Type**
char** pca=ca;
char ** pca2=ca;
char **pca3=ca;
cout<<pca[0]<<","<<pca[1]<<endl;
cout<<"一维指针数组与二维数组----"<<endl;
int *pas[2];
//pas=pa;//错误!一维指针数组与二维数组不能直接转化!
//一维指针数组的元素作为指针变量,可以指向二维数组的行数组
char cs[2][10]={"草泥马2","勒戈壁2"};
ca[0]=cs[0];
ca[1]=cs[1];
cout<<ca[0]<<","<<ca[1]<<endl;
cout<<"二维数组与二级指针----"<<endl;
char **pcax;
//pcax=cs;//错误!
//pcax=&cs;//错误!
//pcax=*cs;//错误!
//pcax[0]=cs[0];//这样虽然没错,但是pcax是野指针,pcax[0]处可能会有其他数据,很有可能会破坏其他数据!!!
//cout<<pcax[0]<<endl;//运行时报错,pcax[0]处没有内容!(报错是肯定的,没内容可能是巧合~)
//先把pcax指向ca4,这样pcax就不是野指针了,不会报错鸟~
pcax=ca4;
cout<<pcax[0]<<","<<pcax[1]<<endl;
//总结:通过以上的测试,好像二维数组与二级指针之间不能直接转化!需要通过一维指针数组中介~
char (**p2p)[2];
//char c2c[2][2][2];
//p2p=c2c;
//p2p[0]=ca4;
}
cppTest-3.0:指针相关-2(二维数组&一级指针&二级指针&一维指针数组)
最新推荐文章于 2022-08-17 13:58:12 发布