C陷阱与缺陷 读后: 数组名与指针的区别
时间:2010-08-13 来源:slimzhao
我相信这一点对于现今的ANSI C不再完全正确.
作者在第
第3章 语义"陷阱"
第3.1 节
中文版第35页中有一段说:
如果calendar 不是用于 sizeof操作数, 而是用于其他的场合, 那么calendar总是被转换成一个指向calendar数组的起始元素的指针.
其中提到的calendar在稍前被定义成:
int calendar[12][31];
这段文字等于说 数组与指针表现不同的唯一场合就是作为sizeof的操作数.
再下面的第35页有一段说的更清楚:
除了a被用作运算符sizeof的参数这一情形, 在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针....
现今的ANSI C是支持"数组的地址"这一概念的:
int a[10];
int (*p)[10] = &a;
其中p是一个指向数组(整个数组作为一个整体)的指针, 而不是指向数组第一个元素的指针.
我第一次看到总结指针与数组不同的地方是<<C专家编程>>, 作者说共有这2种情况.
作者在前面一段中这样说:
p = &a;
这种写法在ANSI C中是非法的, 因为&a是一个指向数组的指针, 而p是一个指向整形变量的指针, 它们的类型不匹配. 大多数早期版本的C语言实现中, 并没有所谓"数组的地址"这一概念.
不知道在<<C陷阱与缺陷>>出版后这么多年里有没有人向Andrw指出过这一点.
作者在第
第3章 语义"陷阱"
第3.1 节
中文版第35页中有一段说:
如果calendar 不是用于 sizeof操作数, 而是用于其他的场合, 那么calendar总是被转换成一个指向calendar数组的起始元素的指针.
其中提到的calendar在稍前被定义成:
int calendar[12][31];
这段文字等于说 数组与指针表现不同的唯一场合就是作为sizeof的操作数.
再下面的第35页有一段说的更清楚:
除了a被用作运算符sizeof的参数这一情形, 在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针....
现今的ANSI C是支持"数组的地址"这一概念的:
int a[10];
int (*p)[10] = &a;
其中p是一个指向数组(整个数组作为一个整体)的指针, 而不是指向数组第一个元素的指针.
我第一次看到总结指针与数组不同的地方是<<C专家编程>>, 作者说共有这2种情况.
作者在前面一段中这样说:
p = &a;
这种写法在ANSI C中是非法的, 因为&a是一个指向数组的指针, 而p是一个指向整形变量的指针, 它们的类型不匹配. 大多数早期版本的C语言实现中, 并没有所谓"数组的地址"这一概念.
不知道在<<C陷阱与缺陷>>出版后这么多年里有没有人向Andrw指出过这一点.
相关阅读 更多 +