今天才发现有人这么用数组:

char a[10];
char * p;
int len;
// ...
memcpy(&a, p, len);

 

一般地,我们应该是memcpy(a, p, len);这样用的,即a前面没有取地址符&。

按我的理解“数组名是指向数组中第一个元素的地址的指针”。既然这样,&a就应该是这个指针的地址。
所以,这两者是不一样的。但我分别打印出它们的内容却是一样的。
后来想想,从语义上是讲的通的。变量a的类型是数组,那&a就应该是这个数组的地址。而a在大多数情况下是“指向数组中第一个元素的地址的指针”,其内容就是数组中第一个元素的地址。
如果:
void* p1 = &a;
void* p2 = a;
那p1的值就是就是这个数组的地址;p2的值就是这个数组中第一个元素的地址。而这两个地址理应是一样的。
这样正着讲确实是能讲通的。但直接看a和&a的值是相等的,就有点不可思议了。
结论:
  • memcpy(&a, p, len);的用法是正确的;而我们(至少是我)常用的memcpy(a, p, len);这样的用法是错误的。程序没出错,只不过是碰巧这两者的值一样罢了。
  • 数组果然是c/c++中比较奇妙的一个东西。
Posted on 2009-05-06 23:36  Soli  阅读(545)  评论(1编辑  收藏  举报