【发布时间】:2015-04-22 01:16:43
【问题描述】:
如果你看一下代码
#include <iostream>
enum Type
{
INT,
FLOAT,
STRING,
};
void Print(void *pValue, Type eType)
{
using namespace std;
switch (eType)
{
case INT:
cout << *static_cast<int*>(pValue) << endl;
break;
case FLOAT:
cout << *static_cast<float*>(pValue) << endl;
break;
case STRING:
cout << static_cast<char*>(pValue) << endl;
break;
}
}
int main()
{
int nValue = 5;
float fValue = 7.5;
char *szValue = "Mollie";
Print(&nValue, INT);
Print(&fValue, FLOAT);
Print(szValue, STRING);
return 0;
}
char *szValue = "Mollie";这行让我很困惑。据我所知,指针是一个保存另一个变量地址的变量。我对那条线的问题显然是
- 这段代码怎么把一个字符串接受成一个字符?我们没有指定这个 char 是一个数组。那怎么来的?
- 我们为什么要为指针分配一个字符串?我以为我们只能为他们分配其他地址。那个指针从哪里得到它的地址?它在哪里存储价值?
我仍然是 C++ 新手,但我们将不胜感激。
更新:我从下面的答案中了解到,当我们说“它将每个字母分配给 szValue 附近的内存地址”时。字符串中的其余字符存储在 +1 地址中。 C++ 如何知道原始字符串中有多少个字符/地址?因为 szvalue 只包含第一个字符的地址。不是其他人吧?
【问题讨论】:
-
专业提示:避免使用
void*。在 C++ 中,请改用template。 -
How come this code accepts a string into a char? We have not specified that this char is an array. Then how come?因为 C++ 的规则说我们可以做到。 -
@Dai 我仍在学习如何编程 C++,因此在此过程中学习了 void 指针,但我会牢记这一建议。首选模板的任何具体原因?
-
@shadoweye14
void*本质上是不安全的,而使用模板会保留所有类型信息。 -
@shadoweye14 我是认真的。当涉及到初始化和
char *时,“字符串”附加了特殊规则。我猜的主要原因是'C'(这是规则的来源)的原始设计者认为字符串是“特殊的”,因此需要一种易于使用的语法。 not 创建了这样一个特殊的语法,没有什么可以阻止的,但他们还是这样做了。