C语言2个基础问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 19:07:41
题一:
int[12]={0},*p[3],**pp,i;
for(i=0;i<3;i++)
p[i]=&a[i*4];
pp=p;
则对数组元素的错误引用是
a.pp[0][1] b.a[10] c.p[3][1] d.*(*(p+2)+2)
我乍看之下,显然是C选项错误因为循环后i最多为2,c选项则有4横排元素了。但是我实在是不明白这道题怎么可能和2维数组拉扯上了联系。还有*p[3],是指向p[3]的指针噻,也和2维数组没有关系??请指教!
题二:
若有下面的说明语句,已知A的十进制数是65,则一下输入结果
union un
{inta;
char c[2];
}w;
w.c[0]='A';w.c[1]='a';
printf("%o\n",w.a)
答案是60501. 据我分析这道题考察的不过是联合体的存储覆盖问题,给char c[2];复制后inta被覆盖,所以inta应该为Aa,换成数字应改为6597,"%o\n"要你换成8进制,我就把6597换成了8进制结果为14705,天啊远远小于答案60501,怎么回事啊,请帮忙一下谢谢!

C语言无聊的两道题目:
1. int *p[3]是:定义一个指针数组。
int (*p)[3]是:定义一个指向二维数组的指针变量,这个二维数组限制死了,就是有几行不知道,但是每一行只能有3个int元素。即:指向xxx[?][3]。
**pp:指向指针的指针。
用图作一个说明:

pp-> p[0]->a[0],a[1],a[2],a[3]
p[1]->a[4],a[5],a[6],a[7]
p[2]->a[8],a[9],a[10],a[11]
pp与p 都是行指针,指向的元素不是单个,而是一行。行指针与列指针可以相互转换。行指针前加* 即可变为列指针。pp[0][1]就是 a[0][1],但a 数组本来就是一维的,所以,a[0][1]就是a[1],
c不对,没有p[3].

2.见我的回答http://zhidao.baidu.com/question/66652431.html

第一题:首先你得明白如何看指针的定义极其类型:对于int *p[3];你先将*后的用括号括住即:int (*p[3]);后面是个变量,也就是说*p[3]数据类型是int。
将其再分解*(p[3]),括号内是指针型,然而里面我们看到的是一个数组,这就是说,定义了一个指针数组(这个数组的没个元素都是指向int型的指针)
对于**,你只要明白*(pp)是个指针,*(*pp)也是个指针,那么定义的pp就是一个指向指针的指针了
对于第一个程序,首先将p[3]的三个int型指针分别指向a[i*4](p[0]->a[0],p[1]->a[4],p[2]->a[8]),最后让pp指向p[3]的头指针p[0]的地址。
pp[0][1]=*pp[0]+1=*pp+1,*pp=&p[0]=p,所以是a[4].
p[3][1