函数调用中char []和char*之间的区别

use*_*059 1 c c++ char

我发现自己无法解释为什么以下代码有效.不用说,我对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]之间差异的答案证实了我的观察,但它没有详细说明为什么会出现这种情况.

谢谢!

cni*_*tar 5

当您将数组传递给函数时,它会衰减到指向第一个元素的指针.

以下是完全相同的:

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 FAQaryptr部分.


pmg*_*pmg 5

在 C 语言中,数组在大多数情况下 (*) 会衰减为指向其第一个元素的指针。

在您的情况下,数组a衰减为指向 的指针a[0]

当仅通过其标识符使用时,数组int arr[12][23]会衰减为指向其第一个元素的指针,即arr[0],其类型为int (*)[23](指向 23 个整数的数组的指针)。

sizeof(*) 当用作运算符的参数、用作运算符的参数&或用作字符数组的初始值设定项(字符串文字)时,数组不会衰减。