c++ - 内存集区别?

标签 c++ pointers

我确实在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/

相关文章:

c - 使用 char 指针 -> 段错误

c++ - 我需要为类输入参数,应该在哪里输入?还有为什么 cout 被认为是在类里面使用的不好的做法?

c++ - 数组声明和寻址

c++ - 在临界区、互斥锁和自旋锁之间进行选择

c++ - 如何从 .t​​xt 文件读取表格到 C++

c - 堆栈和堆上的内存位置模式

c - 在 Mac 上用 C 创建二叉树时出现总线错误 10

c++ - 返回指针 c

c++ - 返回私有(private)数组

c++ - 使用 std::swap 禁用 ADL