如果你看一下代码
#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";
让我感到困惑。从我一直学习的是指针是一个变量,它保存另一个变量的地址。我对这条线的问题显然是
我仍然是C ++的新手,但任何帮助都会受到赞赏。
更新:从我从下面的答案中理解的是,当我们说“它将每个字母分配给szValue附近的内存地址”时。字符串中的其余字符存储在+1地址中。 C ++如何知道原始字符串中有多少个字符/地址?因为szvalue只包含第一个char的地址。不是其他人对吗?
答案 0 :(得分:2)
简而言之,在C ++中,指针和数组几乎是一回事。对于编译器,定义*szValue
或szValue[]
时没有区别。
字符串文字由编译器存储在内存中,第一个符号地址实际上是字符串的值。当您将字符串分配给char *
时,您可能会使用该内存块(即将该地址传递给某个函数或迭代符号)
请仔细检查您找到的pointers-arrays-and-pointer-arithmetic在线教程的更多页面。但是我认为学习C ++最好的是阅读Bjarne Stroustrup
编辑:(感谢seand)
指针和数组几乎是,但不完全相同。 Take,char * x和char y [5]。 'y'就像一个指向固定内容的指针,但'x'可能会重新分配。 sizeof y yield 5.当将x或y传递给函数时,'y'的数组将消失
答案 1 :(得分:1)
前两个答案涵盖了问题的要点。指针和数组之间有很强的相似性(数组可以被认为是指向内存位置的指针)。例如,当数组名称用作函数的参数时,第一个元素的内存地址将传递给函数,而不是该位置的值(普通变量就是这种情况)。
上面的代码将字符串文字“Mollie”分配给char指针szValue。因此,从“Mollie”中的“M”(被视为char而不是字符串)开始,它将每个字母分配给szValue附近的存储器地址。因此,指针变量szValue将指向字符串的第一个元素,相当于说szValue [0](如果szValue被声明为char数组)。
希望这会有所帮助。
编辑: 更具体的说,szValue指向字符串“Mollie”中第一个元素的内存地址,相当于使用&amp; szValue [0]。
答案 2 :(得分:0)
C和C ++中的行char* s = "Mollie"
表示:
s
是指向角色的指针。
它被初始化,指向包含字符M
,o
,... e
和空字符\0
的静态字符数组中的第一个字符。
指针是指向包含类型的内存块的指针。 那块记忆不一定是变量。
答案 3 :(得分:0)
为什么这段代码会将字符串接受到char?
您的代码实际上并没有这样做,而是将第一个字符元素的地址分配给指针的值。 Viz ,指针指向字符串的开头,将指针递增1现在将引用数组中的下一个字符,依此类推。
我们没有指定此char是一个数组。那怎么来的?
你有char*
,而不是char
,这就是区别。此外,语义char[]
和char*
是相同的。
指针从哪里获取地址?
编译器将文字字符串"Mollie"
粘贴到程序内存的只读部分,该部分在操作系统执行程序时加载。 szValue
的值等于该字符串文字的地址。您会发现它是只读的,如果您尝试修改它,您将在Windows上获得段错误(在* nix上)或访问冲突。
答案 4 :(得分:0)
char * foo声明一个char指针,在C中表示数组的表示方式。
所以:
char *foo = "ABCD";
foo [1] =='B'
这也意味着:
*(foo + 1)=='B'
答案 5 :(得分:0)
“Mollie”的实际类型是const char*
。您可以将其视为chars
数组。这就是为什么你可以写这样的东西:
const char c = szValue[4];
这里,szValue只是指向字符串第一个字符的指针。因此,szValue + 1
将是指向第二个字符的指针,依此类推。
答案 6 :(得分:0)
你应该知道当你使用char *szValue = "Mollie";
时,它意味着你将常量字符串“Mollie”的地址分配给szValue而你不能通过szValue改变值,因为“MOllie”是一个存储在的常量值恒定区域。