C 中的字符串用char * 表示。这意味着字符串本身是连续存储的,但变量的实际值是内存中的地址,而不是字符串。该地址指向字符串中的第一个字符。
char *argv[] 表示这些指针的数组。该数组的存储方式相同; argv 的“值”只是指向数组中第一个元素的内存地址。
当您获取该数组的地址时,您获取的是变量本身的内存地址,而不是其内容。然后,您可以将此地址传递给函数以修改该变量,这就是您在此处所做的。
这里是固定代码:
#include <stdio.h>
void changestrings(char **strings[]) { // 1
char *newstrings[5] = { "a", "b", "c", "d", "e" };
*strings = newstrings;
}
int main(int argc, char *argv[]) {
changestrings(&argv);
// (void)argc // 2
printf("%s\n", argv[0]);
return 0;
}
(我添加了 printf 以帮助证明更改有效。)
在// 1,您的原始函数有一个char *[] 类型的参数。这是不正确的,因为当您在argv 上使用& 时,您将地址 传递给char *[]。因此,这应该是char **[](或char ***)。
在// 2,我不确定您在尝试什么,但如果您想更改argc 的值,您可以简单地在main 中分配给它,或者获取它的地址并修改它另一个函数。
请注意,如果您在 main 中定义了新的 char *[],也可以简单地分配给 argv。如果您想更改单个字符串,这会变得有点棘手,因为您需要跟踪数组中有多少个,但该代码看起来像这样:
#include <stdio.h>
void change_first_string(char *strings[], int strings_length) {
if (strings_length < 2) return;
strings[0] = "foo";
}
int main(int argc, char *argv[]) {
change_first_string(argv, argc);
printf("%s\n", argv[0]);
return 0;
}