#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;
} |