简单的C ++指针混乱

时间:2012-11-12 08:29:18

标签: c++ pointers

void changeStr(char *str)
{
    str = "D";
}

void changeStr(char **str)
{
    *str = "S";
}

    char str[] = "Good";
    changeStr(str); 
    cout<<str<<endl;
    char *p = str;
    //*p = 'j';
    changeStr(&p);
    cout<<str<<endl;

我只是尝试更改该数组str[]的值。没有回来!

我认为第一个changeStr只传入str的指针,并更改该值,但实际上并没有改变它。

第二个我使用指针指针但也无法工作。

4 个答案:

答案 0 :(得分:6)

让我们一步一步来。

char str[] = "Good";

您正在创建一个包含以下内容的5个字符的字符数组:

{ 'G', 'o', 'o', 'd', '\0' }

changeStr(str);

在这里,您将该数组传递给函数。由于数组衰减成指针,这个调用完全没问题。

void changeStr(char *str)
{
    str = "D";
}

现在,这是第一个问题。您可能会混淆"D"'D'。如果要更改数组中的第一个字符,则需要按以下方式执行:

str[0] = 'D';

这样可以正常工作。更改指针不会做任何事情,因为它是一个局部变量,它保存指向数组开头的指针,而不是数组本身。如果您想仅使用{ 'D', '\0' }替换数组的整个内容,则需要使用strcpy

strcpy(str,"D");

现在,让我们检查最后一部分。在这里你可以稍微混淆一下。

char *p = str;
changeStr(&p);

您正在创建一个指向数组开头的新变量,并将指向该变量的指针传递给下一个函数。

void changeStr(char **str)
{
    *str = "S";
}

确实改变了传递的原始变量,但请记住,这不是数组p。你所做的是改变p点的位置。它现在指向常量"S"

答案 1 :(得分:1)

changeStr函数的第一个版本中,参数str被认为是局部变量,并且因为所有局部变量的变化只会在实际函数内部发生变化。

第二个版本传递字符串作为参考。基本上,当您指定变量应作为&规范的引用传递时会发生这种情况:

void changeStr(char *&str)

编译器在内部将引用作为指针传递。

答案 2 :(得分:0)

要更改str的值,您必须通过引用传递它。

必须像

void changeStr(char* &str)

这将确保变量通过引用传递,因此如果对函数中的变量进行任何更改,它将是一个全局变化。

答案 3 :(得分:0)

你不应该使用赋值运算符将字符串存储在变量中,即使它是一个指针。 包含string.h后使用strcpy

void changeStr(char *str)
{
    strcpy(str, "D");
}

这应该改变str指针指向的数据......即使在进行函数调用的范围内......