数组,多维数组及指针数组代码验证

int iarray[]={11,2,3,4,5,6,7,8,9,11};
//sizeof()运算符是获得整个数组空间的大小,如果需要获得元素个数,则与数组元素大小相除。
printf("sizeof iarray:%d,size of element:%d,sizeof iarray/element:%d\n",sizeof(iarray),sizeof(iarray[0]),sizeof(iarray)/sizeof(iarray[0]));


char *cp1[]={"ab","cd","ef","gh","ij","df"};//1维指针数组
char cp[6][5]={"ab","cd","ef","gh","ij","df"};//2维数组

//第一种获取1维指针数组内容方法,定义一个指针指向数组的首地址,然后解引用跳转至指针数组所指向的内容
char *dim2_notes = (char *)cp1; //指向指针数组的首地址
for(int i=0;i<sizeof(cp1)/sizeof(char*);i++)
{
//此处对dim2_notes 进行强制解引用(将地址跳转到指针所指向的内容的地址),最终打印出来的是指针指向的内容和对应的地址
printf("array:%d,dim2_notes addr:%x, content addr:%x, cp1:%s\n",i,(char**)dim2_notes+i,*((char**)dim2_notes+i),*((char**)dim2_notes+i));
}
//第二种直接定义一个二维指针指向该指针数组的首地址,使用时无需解引用,但是会增加空间开销。
char **dim3_notes = (char**)cp1;
for(int i=0;i<sizeof(cp1)/sizeof(char*);i++)
{//此处偏移量为指针大小,一维数组不需要指定大小
printf("array:%d,dim3_notes addr:%x, content addr :%x, cp1:%s\n",i,dim3_notes+i,*(dim3_notes+i),*(dim3_notes+i));
}


//对二维数组进行操作
char *dim_cp =(char *)cp;
//依次打印出第一维数组内容
for(int i=0;i<sizeof(cp)/sizeof(char);i++)
{//使用自增会增加2次
printf("array[%d] addr:%x, content:%c\n",i,dim_cp+i,*(dim_cp+i));
}
//依次获取各维数组数据,结构已定因此可以固定大小获取
for(int i=0;i<sizeof(cp)/(sizeof(cp[0])/sizeof(char));i++)
{
printf("array[%d] addr:%x,content:%s\n",i,dim_cp+i*sizeof(cp[i]),dim_cp+i*sizeof(cp[i]));
}


char *notes[3][5]={{"12","32","sf"},{"sf","sfs","1231"},{"sd","123","dsf"}};//二维指针数组
char dim_note[3][3][5]={{"12","32","sf"},{"sf","sfs","1231"},{"sd","123","dsf"}};//三维数组

//多维指针数组,类似于二维,但是我们可以强制降维为2维,然后多次跳转获取数据的地址并打印出内容,理解稍有困难
//指针依然是依次排列,只是在获取多维地址时需要多次跳转。
char *dim_notes = (char *)notes;//强制转化为1维数组并将地址赋值,此时dim_notes指向的地址存储的数据为指针。
//获取数组里面的所有指针并打印内容
for(int i=0;i<sizeof(notes)/sizeof(char*);i++)
{
//此处获取内容时需要解引用
   //多维数组偏移量需要指定,否则解码不知道偏移量的大小。
printf("array:%d,dim_notes addr:%8x, content addr:%8x, notes:%s\n",i,
dim_notes+i*sizeof(char*),*(dim_notes+i*sizeof(char*)),*(char**)(dim_notes+i*sizeof(char*)));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值