您传递的是数组指针的值而非引用。正确的写法应该是:
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);
-
&
表示
地址
),并且在函数中,我们修改存储在我们传递的地址中的变量(
*arr = "bingo";
-
*
表示地址
arr
中的变量)。
假设原始的
blah
指针位于地址0x00000000,并包含例如0x00000010的
"hello"
字符串的地址。如果你将
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中的值,但不会更改地址0x00000000中的值,因此
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...)
希望我没有让您困惑...
这段话与IT技术无关。
strcpy()
或其他字符串函数。 - André Caronstrcpy
,那么将导致未定义的行为(并且在大多数实现中会崩溃并出现内存保护违规),因为blah
指向一个字符串常量,不能写入。 - Jim Balterstrcpy
? - cokedude"bingo"
是一个字符串字面量,它在函数的上下文之外也是有效的,所以你可以从任何地方引用它,因此你只需要一个指向它的指针,而不是它的副本。 - MByD