正如wxj1952所述,在编译器优化时,C默认了很多强制转换,很多在C++上是不允许的,因为这样很不安全,应该显式的转换.
拿数组来说,第1个数值的位置就是数组的物理位置即存储地址.结构也类同.
所以,A,&A,&A[0]都表示数组的首地址.
例如: &A[0] &A[1] &A[2] A数组地址 0x1000,0x1002,0x1004
A[0] A[2] A[2] A数组数值 0x00, 0x01, 0x02
而对于一般变量来说 &a a变量的地址 0x2000 a a变量的数值 0x00
用c语言来表述: unsigned int A[3] at 0x1000 = {0,1,2}; unsigned int a at 0x2000 = 0;
若: unsigned int *p; p = A; p = &A[0]; p = A[0];肯定错 因为左值是指针变量p,应该是指针即地址 而右值是数组第1个单元A[0]的数值而非地址本身! 但是我的A[0]内就是我需要的地址呢???当然是要做强制转换了 即: p = (unsigned int *)A[0];
但是一般变量很容易误导. p = &a;//正确 p = a;//我晕!!!a的地址&a是0x2000,而0x2000的内容a是0.
以下都能通过吗???
p = (unsigned int *)0x2000;//知道a的地址
if (p == &a) { puts("这个俺明白"); } if (p == a) { puts("这个是做梦吧,除非编译器认为左值是指针右值肯定为指针即a的地址"); } else { puts("俺**p != a的说明"); }
故菜农认为: 即使编译器认为左值是指针,右值肯定为指针即地址. 那么也应该养成区分a和&a的好习惯~~~
否则程序移植到C++上就要漫天找错了~~~
|