c语言数组与指针的问题

Exercise5.2已知c语言inta[]={8,4,7,2,6};intb[]={5,1,3};int*x[2];int*p=a;int**q=x;x[0]=a;x[... Exercise 5.2

已知c语言
int a[] = {8, 4, 7, 2, 6};
int b[] = {5, 1, 3};

int *x[2];

int *p = a;

int **q = x;

x[0] = a;

x[1] = b;

求下面这些的值:还有很多都已经做完了但是下面这一些有点不确定。请把答案告诉我 如果可以请帮我解释一下为什么 本人初学者。求帮助。
*((&**x) + 1):
*&*x[1]:
**&p:
**q:
***&q:
q[1][2]:
**(q + 1):
*(*(q + 1) + 1):
**(q + 1) + 1:
展开
 我来答
加菲19日55
2014-05-26 · 超过55用户采纳过TA的回答
知道答主
回答量:137
采纳率:0%
帮助的人:55.3万
展开全部
问题1:一维数组名与二维数组名含义是不一样的,当然跟你理解的指向行或者列是有一定的偏差的。
对于一维数组,比如int a[4],a代表的是int型的指针,其地址指向a[0],对于二维数组比如a[2][4],a代表的是也是指针,只不过不是简单的int型指针,而是你代码中的数组指针,它与一维数组中指针的区别是:当一维数组名a++时(即步长),指针移动字节数为int型数据所占字节数,但是对于二维数组中a++时,指针移动字节数为列数乘以int型数据所占字节数,即4(代表数组有4列)乘以sizeof(int)。

问题2:先说一下&a代表的意思。假设数组为int a[4]
对于一维数组&a代表的是int型数组指针,它与a的区别是a是int型指针,但是&a代表是int型数组指针,&a的步长为以为数组大小乘以int型数据所占字节数,所以当p = a时,这两个类型不匹配,因为p为int型数组指针,a为简单int型指针,对于表达式p = &a,这个表达式刚好类型匹配,它们的步长都是(4 * sizeof(int))。

问题3:对于int (*p)[4]代表的是int型数组指针,步长是(4 * sizeof(int))。首先说明的是对于第7行程序打印的结果不是a[3]对应的值,这样的操作属于越界(即访问到数组外的内存)。对于(*p)[3]表达式代表*(p + 3),因为p步长为16字节(假设int型数据占4字节),所以*(p + 3)其实访问的是数组首地址加上16乘以3地址处的数据。

问题4:对于二维数组int a[2][4]以及int (*p)[4],因为a与p都是int型数组指针,所以类型匹配,所以对于第6行:p = a即可,如果想输出a[0][3],用printf("%d\n", *(*(p) + 3));即可。对于二维数组而言,存在&a的语句,它同样是数组指针,其步长是行数乘以列数乘以int型所占字节数,对于
int a[2][4],&a的步长为2 * 4 * sizeof(int)。

问题:对于二维数组*score它也是一个指针,并且是个数组指针,如果改成&score以后,虽然都是数组指针,但是步长不一致,编译器会报警告。

希望上述回答对你有一定帮助。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式