打印

实际使用中没有问题的话,就**自己认为正确的就可以了

[复制链接]
楼主: wrainp
手机看帖
扫描二维码
随时随地手机跟帖
81
古道热肠| | 2009-9-13 17:30 | 只看该作者 回帖奖励 |倒序浏览
哈哈,这么热闹,原来是来了一位女侠.

使用特权

评论回复
82
BRL_mjc| | 2009-9-13 19:58 | 只看该作者
我觉得11楼的这个问题很明确,

使用特权

评论回复
83
BRL_mjc| | 2009-9-13 20:02 | 只看该作者
*(&cB) = *(&cA); // error, why?
cB和cA是一个常量,就是数据第一个元素的地址,所以你对一个常量取地址是错误的。例如你写成这样:&5一样

使用特权

评论回复
84
o蓝玉莹| | 2009-9-13 22:29 | 只看该作者
#include "stdafx.h"

char cA[10];
char cB[10];

int main(int argc, char* argv[])
{

    *(&cB) = *(&cA); // error, why?

    // 编译器对 (&cA) 和 (&cB) 求值,得到指向“包含10个char类型元素的数组类型”的指针,即char (*)[10] ,随后编译器对 char (*)[10] 解引用,结果类型为“包含10个char类型元素的数组类型”。而数组是不能整体赋值的,所以产生语法错误。

    *(cB) = *(cA); // ok
    *(&cB[0]) = *(&cA[0]); // ok

    // 上面两种情况是一回事,编译器将把数组名cA和cB转换为指向数组首对象的指针,即 (char *) 。(注意:是“首对象”而不是“首地址” ,对C数组而言首对象就是数组的第一个元素,即cA[0] 和 cB[0] ,它们的类型是char)。随后编译器对 (&cA[0]) 和 (&cB[0]) 解引用,结果类型为“char类型”,并且是个可修改的左值。这是两条合法的C语句。

    return 0;
}

使用特权

评论回复
85
fugong| | 2009-9-13 22:35 | 只看该作者
这涉及C编译器怎么处理左值与右值的规定;还有就是编译器只不能访问一个地址开始的整体,只能逐一访问整体中的单个地址。对*(&cB)的操作代表的是一个整体的操作,对*(cB)的操作是对一个地址的操作。

使用特权

评论回复
86
o蓝玉莹| | 2009-9-13 23:05 | 只看该作者
编程语言可以看成是编译器的生产者与使用者之间的协议
既然是协议,当然要尽量公平呀,语言的制定者需要兼顾各方的利益
一些语法规则在使用者看来是“不合理”甚至“缺陷”,但编译器却喜欢
所以理解编译器的实现非常有助于理解语言的内涵

使用特权

评论回复
87
mcuisp| | 2009-9-13 23:43 | 只看该作者
有点敬佩LS mm了。
保守估计智商一定大于135。。。

使用特权

评论回复
88
ruiwei0201| | 2009-9-14 10:45 | 只看该作者
int a[5] = {1,2,3,4,5};
int *p = a;
int (*p)[5];
p = &a;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则