我正在学习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
pvalue2
给出“指向”字符串文字
而不是内存地址? “指针值”不是它指向的内存地址吗?答案 0 :(得分:9)
operator<<
输出流有一个char*
的重载,它将字符数组解释为字符串而不是通用指针。因此,它打印字符串的值。使用static_cast<void*>(pvalue2)
打印地址。
取消引用该字符串会为您提供char
,而不是字符串。
如果您使用的是C ++,请使用std::string
而不是字符数组。如果你需要一个C风格的字符串,你可以通过调用c_str()
方法获得字符串的字符数组表示。
答案 1 :(得分:6)
为什么指针pvalue2给出&#34;指向&#34;字符串文字而不是内存地址?
因为<<
有一个特殊的重载,所以流char*
会给它指向的字符串,而不是指针值。这通常是你想要发生的事情。
不是&#34;指针值&#34;总是它指向的内存地址?
是
为什么解除引用只给出数组中的第一个字符?
因为指针包含单个对象的地址,在这种情况下它是数组的第一个元素。可以使用指针算法访问其他元素,例如, pvalue2[2]
代表第三个元素。
在这种情况下,如何获取内存地址?
要使用<<
进行打印,请转换为其他指针类型以避免char*
重载:
std::cout << static_cast<void*>(pvalue2);
答案 2 :(得分:0)
我已引用&#34;给出&#34;在你的问题而不是&#34;指向&#34;因为前者在你的脑海中是模糊的。你用对象做什么取决于你。 pvalue2
只是一个数字。
相同&#34;给出&#34;。取消引用指向char
的指针会返回char
本身。对于C字符串,它返回第一个字符。
当然,最重要的是指针。其余的是项目大小,类型本身固有的。 (增加指针按项目大小递增,而不是1)。
在什么情况下?如果你持有一个指针,你已经拥有了内存地址。如果您持有第一个字母(我猜是案例3),请取其地址。