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

/**
 * 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值