我发现自己无法解释为什么以下代码有效.不用说,我对C++很陌生......
#include <cstdio>
void foo(char* p)
{
p[0] = 'y';
}
int main()
{
char a[1];
a[0] = 'x';
printf("a[0] = %c\n", a[0]);
foo(a);
printf("a[0] = %c\n", a[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该计划输出
a[0] = x
a[0] = y
Run Code Online (Sandbox Code Playgroud)
是什么让我感兴趣的是我没有将指针传递给foo.那么如何才能改变数组的值?这只适用于char数组吗?
char和char [1]之间差异的答案证实了我的观察,但它没有详细说明为什么会出现这种情况.
谢谢!
当您将数组传递给函数时,它会衰减到指向第一个元素的指针.
以下是完全相同的:
void foo(char* p);
void foo(char p[]);
void foo(char p[42]); /* Or any other number. */
Run Code Online (Sandbox Code Playgroud)
这只适用于char数组吗?
在 C 语言中,数组在大多数情况下 (*) 会衰减为指向其第一个元素的指针。
在您的情况下,数组a衰减为指向 的指针a[0]。
当仅通过其标识符使用时,数组int arr[12][23]会衰减为指向其第一个元素的指针,即arr[0],其类型为int (*)[23](指向 23 个整数的数组的指针)。
sizeof(*) 当用作运算符的参数、用作运算符的参数&或用作字符数组的初始值设定项(字符串文字)时,数组不会衰减。