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: 展开
已知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: 展开
1个回答
展开全部
问题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以后,虽然都是数组指针,但是步长不一致,编译器会报警告。
希望上述回答对你有一定帮助。
对于一维数组,比如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以后,虽然都是数组指针,但是步长不一致,编译器会报警告。
希望上述回答对你有一定帮助。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询