两个有关数组的变量名和其地址的问题?
这个问题,源于我看到一段代码,于是研究了一下
int b[5] = {1,2,3,4,5}; int *a = (int *)(&b + 1);
可是我发现这样一个问题,如果你用VS2010 去debug,你会发现:
b, 0x0045fa54
&b, 0x0045fa54
b+1, 0x0045fa58
&b + 1, 0x0045fa68 //b 和 &b 相等,但b+1却不等于&b + 1,并且,&b + 1还是可以展开的,展开也是包含有5个元素,只是里面的值都非常巨大和怪异
b == &b, 1 // 如果你去判断b == &b,返回值是true
我不太清楚这是CRT就是这么解释的,还是哪里有问题?
第二个问题,一个数组名a (e.g. int a[10])是一个指针么?
template <typename T > struct is_a_ptr { enum{ yes = FALSE }; }; template <typename T > struct is_a_ptr <T* > { enum{ yes = TRUE }; }; template <typename T> inline void UnusedVar(const T&) { if(is_a_ptr<T>::yes) printf("Type T is a pointer!\r\n"); else printf("Type T is *NOT* a pointer!\r\n"); }
如果此时,你调用这个函数,输出会是什么?is or is *NOT*?
int a[5] = {7};
UnusedVar(a);