我确实在msdn和cplusplus.com上看过memset的用法,我知道(如果我不对请指正):
int p =3;
// p = object value
// &p = memory address where p is stored
那么有什么区别:
char szMain[512];
memset( szMain, 0x61, sizeof( szMain ) );
cout << szMain[4];
和:
char szMain[512];
memset( &szMain, 0x61, sizeof( szMain ) );
cout << szMain[4];
(0x61 = a,ASCII 表十六进制)
为什么两者有相同的行为?如果这不是一个建设性的问题,请原谅我。 我是 C++ 的新手,我似乎无法理解。
最佳答案
标准中将发生的事情描述为数组到指针的转换。
4.2 Array-to-pointer conversion [conv.array]
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to an rvalue of type “pointer to T”. The result is a pointer to the first element of the array.
上面说在你第一次调用 memset
时,szMain
被转换为一个指针(更具体地说是一个指向 char
的指针)存储数组第一个元素的地址。
在第二次调用中,&szMain
将产生一个类型为char (*)[512]
的指针,即。指向与 szMain
具有相同类型的数组的指针,存储数组本身的地址。
这两个表达式将产生完全相同的值,因为 szMain
的开头与它的第一个元素 (szMain[0]
), 但请注意它们不是同一类型。
memset
接受 void*
作为第一个参数,因此可以隐式使用任何指针类型来调用该函数。
关于c++ - 内存集区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11198776/