0
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

4 回答 4

6

让我们一步一步来。

char str[] = "Good";

您正在创建一个字符数组,长度为 5 个字符,内容如下:

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

changeStr(str);

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

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

现在,第一个问题来了。您可能会感到困惑"D"并且'D'. 如果要更改数组中的第一个字符,则需要按以下方式进行:

str[0] = 'D';

这会很好。更改指针不会做任何事情,因为它是一个局部变量,它保存指向数组开头的指针,而不是数组本身。如果你想用 just 替换数组的全部内容{ 'D', '\0' },你需要使用strcpy.

strcpy(str,"D");

现在,让我们检查最后一部分。在这里你把事情搞混了。

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

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

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

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

于 2012-11-12T08:48:27.133 回答
1

changeStr函数的第一个版本中,参数str被认为是局部变量,并且所有局部变量对它们的更改仅在实际函数内部进行更改。

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

void changeStr(char *&str)

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

于 2012-11-12T08:36:35.170 回答
0

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

它必须像

void changeStr(char* &str)

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

于 2012-11-12T08:45:10.843 回答
0

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

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

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

于 2012-11-12T09:34:09.240 回答