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

时间:2011-04-10 12:51:37

标签: c arrays function pointers

我想调用一个函数,我希望该函数将程序中字符串或数组的内容更改为常量。

伪码:

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;
}

我该怎么做?

3 个答案:

答案 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它,如果你需要数组大小是动态的!