繁体   English   中英

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

[英]Difference between char[] and char* in function call

我发现自己无法解释以下代码为何起作用。 不用说,我对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;
}

该程序输出

a[0] = x
a[0] = y

令我着迷的是,我没有将指针传递给foo,而是将数组传递给了foo。 那么foo如何改变数组a的值呢? 这仅适用于char数组吗?

char和char [1]之间的区别的答案证实了我的观察,但并未详细说明为什么会这样。

谢谢!

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

以下是完全等效的:

void foo(char* p);
void foo(char p[]);
void foo(char p[42]); /* Or any other number. */ 

这仅适用于char数组吗?

它适用于任何数组。 我推荐C FAQaryptr部分

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

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

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

(*)用作sizeof运算符的参数,用作&运算符的参数或用作字符数组的初始化程序(字符串文字)时,数组不会衰减。

当你说

char a[5];

编译器分配5个连续的内存块,并且第一个块的地址分配给a。 因此,根据定义,数组的名称(在我们的例子中为a)只是指向内存位置的指针。

现在,当我们说a [0]时,编译器将其处理为*(a + 0 * sizeof(数组数据类型,即char,int等。)),符号地将a [i]表示为*(a + i * sizeof(array数据类型即char,int等))

就函数参数传递而言,当我们将数组传递给函数时,基本上只是传递的第一个元素的地址。 有关此plz的更多详细信息,请单击此链接或阅读@cnicutar的答案(由于他已经发布了正确的答案,因此没有必要再重复一次)...

您可以尝试这样做以说服自己如何工作。

int a[8], *p;
p = a;
printf("%p, %p, %p\n", a, &a[0], p);

数组无非是一个指针(指向第一个元素),至少是为了传递参数。

这里的三个原型是等效的:

void foo(char *p);
void foo(char p[]);
void foo(char p[42]);

Ç说的类型阵列的参数的声明T 调节到类型的指针到一个声明T

数组名称指向数组第一个元素的地址。 请参阅: 数组名称是指针吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM