使用C中的函数更改数组?

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)

希望我没有迷惑你......

  • @AndréCaron:这是一个误导性的看法.在C中,数组永远不会*传入或传出函数.所有看起来像采用数组的函数实际上都是指针,声明返回数组的函数是非法的.所有参数(包括指针)总是按值传递给C中的函数.C是一种"仅按值传递"的语言. (6认同)

Fer*_*cio 7

您的代码中没有数组.如果您实际上正在尝试修改您的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)

  • @cokedude - 你实际上不能将数组作为参数传递给C中的函数.数组将"衰减"成指向数组第一个元素的指针,因此调用`changeArray(blah)`与`changeArray(&blah [ 0])`.由于函数声明为`void changeArray(char arr [])`,它与`changeArray(char*arr)`相同,因此调用与函数签名匹配. (3认同)