[英]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]之间的区别的答案证实了我的观察,但并未详细说明为什么会这样。
谢谢!
在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.