我想调用一个函数,我希望该函数将程序中字符串或数组的内容更改为常量。
伪码:
some_array = "hello"
print some_array #prints "hello"
changeArray(some_array)
print some_array #prints "bingo"
我知道我必须将指针传递给该函数。这是我写的,
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;
}
我该怎么做?
答案 0 :(得分:30)
您正在通过值而不是引用将指针传递给数组。它应该是:
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";
,这两者都很好,但是如果你考虑改变字符串本身,你将无法做到。 / p>
修改强>
当你将一个参数,甚至一个指针传递给一个函数时,你实际上将它复制到函数从那里读取它的某个地方(通常是堆栈)。您不会传递参数本身,而是传递它的副本。当函数修改它时(如在arr = "bingo";
中),它修改变量的副本,而不是原始变量。因此,为了更改变量本身,我们将变量的地址传递给函数(changeArray(&blah);
- &
表示address of-
),并在函数中修改存储在变量中的变量我们传递的地址(*arr = "bingo";
- *
表示地址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的内容是< strong>地址,转到此地址并将其内容更改为指向“bingo”字符串“。所以现在地址0x00000000(blah
)中的内容指向“宾果”。
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...)
希望我没有把你弄糊涂......
答案 1 :(得分:6)
您的代码中没有数组。如果您实际上正在尝试修改您的blah字符指针所指向的内容,那么您需要将指针传递给指向该函数的指针。 但是,如果您想使用数组执行此操作,则需要执行以下操作:
void changeArray(char arr[]) {
// or you can use char *arr, it's the same thing from
// the C compiler's point of view
strcpy(arr, "blah");
// alternatively, you could set each element. i.e. arr[0] = 'b';
}
int main (int argc, char** argv) {
char blah[100] = "hello"; // this is an array
printf("Array is %s\n", blah);
changeArray(blah); // array decays to pointer
printf("Array is %s\n", blah);
return EXIT_SUCCESS;
}
答案 2 :(得分:0)
您需要将指针传递给数组而不是数组本身。
另一件事:为你的功能添加一个控制条件。想想:如果“bingo”比strlen(some_array)更大,会发生什么?它会给你一个错误,因为在C中你需要malloc它,如果你需要数组大小是动态的!