cppTest-3.0:指针相关-2(二维数组&一级指针&二级指针&一维指针数组)

来源:互联网 发布:淘宝店铺登录界面 编辑:程序博客网 时间:2024/05/22 17:39
/** * 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;}

0 0
原创粉丝点击