轩辕传奇手游刺客灵宠:c语言高手进

来源:百度文库 编辑:中科新闻网 时间:2024/04/28 06:28:19
main()
{union {char i[2];
int k;}r;
r.i[0]=2;
r.i[1]=0;
printf("%d\n",r.k);
}
不能理解为什么输出答案是:2
---------
main()
{double s[10][22];
int n;
.....
fun(s);
.....
}
....
void fun(double b[10][22])
{
.....
}
可以这样定义实参跟形参嘛?
按照书上讲的,二维指针作为函数参数应该这样定义的啊

实参:
fun(s,10,22)
形参:
void fun(double (*)[10],int m,int n)
请帮我解释下
fun(s);

void fun(double b[10][22])
的定义是否正确???



第一个问题还是不懂 可以说的再详细点嘛?


第一个问题:Union在内存中的样子是{2,0,0,0},一共四个字节,前两个i与k公用,后两个由于没有赋值应该是0。然后输出的时候,把这四个字节一起作为一个int,注意了问题就在这里:Intel的芯片中,内存中的变量是按从低位到高位排列的,术语叫“小头在前”,这与人们数学上的习惯不一样!也就是k在内存中是{2,0,0,0}在逻辑上应该是{0,0,0,2},这个反转操作是在CPU内部完成的,如果不像你这样刻意去查看是发现不了的。这是体系结构的问题造成的,如果在Mac机上就不会这样了。
第二个问题是C的问题:C中声明在函数形参中的数组会“褪化”成首位指针,就是说void fun(double b[10][22])与void fun(double (*)b[10])是没有区别的,编译器会忽略数组大小。正由于这个大小被忽略了,所以教科书上要求在后面的形参中显式地提供大小,就是void fun(double (*)[10],int m,int n) 这个样子了。如果函数有其他方法知道数组的大小,那么后面的形参就不是必要的。

1、 union是定义共用体的,在共用体中类形共用同一个字节
你定议的这个 共用体共用了2个字节,你只把字符2付给了i[0],0付给了
i[1]。而输出 r.k时,由于k和i共用同一字节,所以输出是2。
2、 void fun(double (*)[10,int m,int n) 定议并没有错,但如果你的实参 s必须是 二维指针,double (*)[10]是定议了一个二维指针

我的QQ号是89014973 我建了个C语言群,大家一起来聊聊吧

第1题中是共用的4个字节(与平台有关,但一般应该是4)。最低的字节存储的是2。其他的可能是0(我不清楚编译器会不会初始化)。所以可能识别为2。即低字节存储int的低位。
这个结果与平台有关。在intel上和在mac上可能有差别。

第2个问题中这样应该是可以通过,但是,一般不会这么定义吧,能把行列号写死吗?这样的代码不好扩充。如果对行列号有限制,一般是在函数体中检查;如果需要传递行列号,另外加两个整型参数。

我认为都行,但是实参和形参的定义方式要一致。