当数组在函数中传首地址时,在函数中给数组赋值为什么不用像普通指针(p = a)一样加一个,不是说数组只是会退化成指针嘛
数组退化成指针,只是说 sizeof 得不到长度
但是还是两个类型,不能相互赋值
可以 int *p = &a[0];
供参考:
#include <stdio.h>
void fun(int* a, int n)
{
int i = 0, * p;
for (p = a; p < a + n; p++)
*p = i++;
}
int main()
{
int a[10], n = 10, i;
fun(a, n);
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
【以下回答由 GPT 生成】
给数组赋值和给指针赋值的区别是因为数组名和指针变量这两个概念在语法上的不同。
在C语言中,数组名表示数组的首地址,指针变量是一个变量,用于存储地址。
当我们使用指针变量来赋值时,例如 (*p = a),这表示将指针变量p的值设置为a,也就是将p指向a所在的地址。这是因为指针变量存储的是一个地址,可以通过解引用操作符 * 来访问该地址上的值。
而数组名在赋值上与指针变量是不同的,数组名不能被赋值,也不能使用解引用操作符 *。这是因为数组名表示的是数组的首地址,它是一个常量指针,不允许改变。即使我们尝试修改数组名的值,也会导致编译错误。
所以,数组名和指针变量虽然在某些情况下可以互相替换使用,但在赋值操作上是不同的。数组名不能被赋值,而指针变量可以通过解引用操作符 * 来改变指向的地址。
数组名作实参传递给函数,在该该函数内,该实参就是一个指针,跟普通指针用法一样。因为不管什么参数,普通数据也好指针本身也罢,传递过来只是一份拷贝。