您通过值而不是通过引用传递指向数组的指针。应该是:
void changeArray(char **arr){
*arr = "bingo";
}
int main(int argc, const char* argv[]){
char *blah = "hello";
printf("Array is %s\n",blah);
changeArray(&blah);
printf("Array is %s\n",blah);
return EXIT_SUCCESS;
}
您将“hello”的地址提供给changeArray 函数,但在函数中您更改了传递的值,而不是原始指针。我所做的更改传递了指针的地址,而指针本身在函数中发生了更改。
请不要char *blah = "hello";定义一个指向常量字符串的指针,以及*arr = "bingo";,这两者都可以,但是如果你考虑改变字符串本身,你将无法做到。
编辑:
当您将参数(甚至是指针)传递给函数时,实际上是将其复制到函数从那里读取它的某个位置(通常是堆栈)。您不会传递参数本身,而是传递它的副本。当函数修改它时(如在arr = "bingo"; 中),它会修改变量的副本,而不是原始变量。所以为了改变变量本身,我们将变量的地址传递给函数(changeArray(&blah); - & 表示address of-)并在函数中修改存储在我们传递的地址中的变量(@987654329 @ - * 表示地址 arr 中的变量。
假设原来的blah指针位于地址0x00000000并且包含"hello"字符串的地址,例如0x00000010。如果将blah 传递给函数,则将其复制到一个新变量arr,例如位于地址0x00000020 中
Variable Address content
-------------------------------
blah 00000000 00000010 (points to hello)
"hello" 00000010 "hello" (this is just an example, so don't be hard on me :) )
arr 00000020 00000010
"bingo" 00000030 "bingo" (and again...)
现在,如果您更改arr 的内容,您会更改地址 0x00000020 中的值,但不会更改地址 0x000000000 中的值,因此blah 仍然包含 00000010。
Variable Address content
-------------------------------
blah 00000000 00000010 (points to hello)
"hello" 00000010 "hello" (this is just an example, so don't be hard on me :) )
arr 00000020 00000030 (points to "bingo")
"bingo" 00000030 "bingo" (and again...)
我们所做的是将blah的地址,即0x00000000复制到arr,在函数中我们说-“arr的内容是一个地址,去这个地址,把它的内容改成指向“bingo”字符串。所以现在地址 0x00000000(即blah)中的内容指向“bingo”。
Variable Address content
-------------------------------
blah 00000000 00000030 (points to "bingo")
"hello" 00000010 "hello" (this is just an example, so don't be hard on me :) )
arr 00000020 00000000 (points to `blah`)
"bingo" 00000030 "bingo" (and again...)
希望我没有把你弄糊涂……