C ++指针的麻烦

时间:2015-04-22 01:16:43

标签: c++ pointers

如果你看一下代码

#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中?我们没有指定这个char是一个数组。那怎么来的?
  • 我们怎么为指针分配STRING?我以为我们只能为他们分配其他地址。指针从哪里获取地址?它存储价值在哪里?

我仍然是C ++的新手,但任何帮助都会受到赞赏。

更新:从我从下面的答案中理解的是,当我们说“它将每个字母分配给szValue附近的内存地址”时。字符串中的其余字符存储在+1地址中。 C ++如何知道原始字符串中有多少个字符/地址?因为szvalue只包含第一个char的地址。不是其他人对吗?

来源:LearnCPP - Void Pointers

7 个答案:

答案 0 :(得分:2)

简而言之,在C ++中,指针和数组几乎是一回事。对于编译器,定义*szValueszValue[]时没有区别。

字符串文字由编译器存储在内存中,第一个符号地址实际上是字符串的值。当您将字符串分配给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是指向角色的指针。 它被初始化,指向包含字符Mo,... 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”是一个存储在的常量值恒定区域。