多维数组的问题

昨天在网上看到这样一个问题:

char **p, a[16][8]; 

问:p=a是否会导致程序在以后出现问题?为什么?

答案:这个会导致出现问题:
不能将'char [16][8]'转化成‘char**’

也就是说a可以认为是char(*)[8]类型,a是指向数组的指针

可以改成这样 char (*p1)[8]=a,

但是要注意p的使用,如a[1][2] 等价的为 *(*(p+1)+2)而不是*(p+11)。

我是这样理解的:

对于一个多维数组:char a[m][n];可以认为它是 MYTYPE a[m];这里的

MYTYPE是char b[n];即:数组a由m 个含n元素的一维数组组成。我们理解a是一个数组变量,a中保存的是它的首元素的地址,而它的首元素是MYTYPE类型的a[0]也是一个数组,这样就是说,a中保存的地址所保存的内容是b(b是一个数组),那么a+1时跳过的就是一个数组(跳过a所存的地址所表示的变量的长度);而b中保存的是b的首元素地址,所以b+1时跳过的是b的一个元素。

 

注:

还有两个问题,比较容易理解:

(1)

char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };
for(int i=0;i<12;i++)
      printf("%d ",_______);
在空格处填上合适的语句,顺序打印出a中的数字

答案:a[i/6][(i/3)%2][i%3]

 

 

 (2)
下面这段代码的输出是多少(在32位机上).
    char *p;
    char *q[20];
    char *m[20][20];
    int (*n)[10];
    struct MyStruct
{
char dda;
double dda1;
int type ;
}
MyStruct k;
 printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));
答案:4,80,1600,4,24
           n 是指向一维数组的指针变量;k中不要忘了考虑对齐问题,这里dda为4个字节。
这里要明确:
一个字:多少位机即为多少位,32位机--32位,16位机--16位
char占一个机器字节,
short 半个字,int占一个字,long占一个或者两个字(32位机中,int long通常长度相同)
float 1个字,double 2个字,long double三个或四个字。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值