如何在 C++ 中为 char 数组动态分配内存?

How to allocate memory dynamically for a char array in C++?

我正在学习 C++ 中的动态内存。例如,我学到的为任何数据类型动态分配和解除分配的标准方法是

//For double,
double* pvalue1 = nullptr;
pvalue1 = new double;
*pvalue1 = 17.3;
delete pvalue1; //free up when I'm done

但是,对于 char 数组,我了解到它的处理方式不同:

char* pvalue2 = nullptr;
pvalue2 = new char[6];
strncpy(pvalue2,"Hello",sizeof("Hello"));

std::cout << "Pointed-to value of pvalue2 is " << *pvalue2 << std::endl;
std::cout << "Value of pvalue2 is " << pvalue2 << std::endl;

delete [] pvalue2; //free up when I'm done

然后,在命令提示符下:

Pointed-to value of pvalue2 is H
Value of pvalue2 is Hello
  1. 为什么指针pvalue2给出了"pointed-to"字符串字面量 而不是内存地址? "pointer value" 不就是它指向的内存地址吗?
  2. 为什么取消引用只给出数组中的第一个字符?
  3. 在这种情况下,我怎样才能得到内存地址呢?

输出流的 operator<< 重载了 char*,它将字符数组解释为字符串而不是通用指针。因此,它打印字符串的值。使用static_cast<void*>(pvalue2)打印地址。

取消引用字符串会得到一个 char,它不是字符串。

如果您使用的是 C++,最好使用 std::string 而不是字符数组。如果你需要一个 C 风格的字符串,你可以通过调用 c_str() 方法来获得字符串的字符数组表示。

Why does the pointer pvalue2 give the "pointed-to" string literal instead of the memory address?

因为 << 有一个特殊的重载,所以流 char* 将给出它指向的字符串,而不是指针值。这通常是您希望发生的事情。

Isn't a "pointer value" always the memory address which it points to?

是的。

Why does dereferencing give only the first character in the array?

因为指针包含单个对象的地址,在本例中是数组的第一个元素。可以使用指针算法访问其他元素,例如pvalue2[2] 为第三个元素。

How can I get the memory address then, in this case?

要用 << 打印它,转换为不同的指针类型以避免 char* 过载:

std::cout << static_cast<void*>(pvalue2);
  1. 我会在你的问题中引用 "gives" 而不是 "pointed-to" 因为前者在你的脑海中是模糊的。你对对象做什么取决于你。 pvalue2 只是一个数字。

  2. 相同"gives"。很好地取消引用指向 char returns 的指针 char 本身。对于 C 字符串,它 returns 第一个字符。

  3. 当然,最重要的是指针。其余的是项目大小,类型本身固有的。 (递增指针按项目大小递增,而不是 1)。

  4. 在什么情况下?如果你持有一个指针,你就已经有了内存地址。如果您持有第一个字母(我猜是情况 3),请获取其地址。