由于已经回答了其他方面,我只会添加问题“如果您想要使用 char * 传递函数的灵活性但 char [] 的可修改性怎么办”
您可以分配一个数组并将相同的数组传递给一个函数作为 char *。这称为按引用传递,内部仅传递实际数组的地址(准确地说是第一个元素的地址),而不是复制整个。另一个影响是函数内部所做的任何更改都会修改原始数组。
void fun(char *a) {
a[0] = 'y'; // changes hello to yello
}
main() {
char arr[6] = "hello"; // Note that its not char * arr
fun(arr); // arr now contains yello
}
对于使用 malloc 分配的数组也可以这样做
char * arr = malloc(6);
strcpy(arr, "hello");
fun(arr); // note that fun remains same.
稍后您可以释放 malloc 内存
free(arr);
char * a, 只是一个可以存储地址的指针,它可能是单个变量,也可能是数组的第一个元素。请注意,我们必须在实际使用它之前分配给这个指针。
与 char arr[SIZE] 相反,它在堆栈上创建一个数组,即它还分配 SIZE 个字节。因此,您可以直接访问 arr[3](假设 3 小于 SIZE)而不会出现任何问题。
现在允许将任何地址分配给 a是有意义的,但不允许将其分配给 arr,因为除了使用 arr 访问其内存之外别无他法。