Ale*_*lex 15 c arrays pointers function
我想调用一个函数,我希望该函数将程序中字符串或数组的内容更改为常量.
伪代码:
some_array = "hello"
print some_array #prints "hello"
changeArray(some_array)
print some_array #prints "bingo"
Run Code Online (Sandbox Code Playgroud)
我知道我必须将指针传递给该函数.这是我写的,
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;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
MBy*_*ByD 32
您是通过值而不是引用将指针传递给数组.它应该是:
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;
}
Run Code Online (Sandbox Code Playgroud)
你给了changeArray
函数"hello"的地址,但在函数中你改变了传递的值,而不是原始指针.我所做的更改传递了指针的地址,并且在函数中更改了指针本身.
请不要char *blah = "hello";
定义一个指向常量字符串的指针*arr = "bingo";
,这也很好,但如果你考虑更改字符串本身,你将无法做到.
编辑:
当你将一个参数,甚至一个指针传递给一个函数时,你实际上将它复制到函数从那里读取它的某个地方(通常是堆栈).您不会传递参数本身,而是传递它的副本.当函数修改它时(如in 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...)
Run Code Online (Sandbox Code Playgroud)
现在,如果更改内容,则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...)
Run Code Online (Sandbox Code Playgroud)
相反,我们所做的是将地址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...)
Run Code Online (Sandbox Code Playgroud)
希望我没有迷惑你......
您的代码中没有数组.如果您实际上正在尝试修改您的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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
56093 次 |
最近记录: |