C语言中 数组到底是不是指针和数组作为参数问题

2025-02-26 00:17:16
推荐回答(3个)
回答1:

数组名可以当做指针来运算,但数组名是指向数组首地址的指针常量,不可改变的。比如:
int a[10] = {1,2,3,4,5,6,7,8,9,0};

a是数组的首地址,是不可改变的常量,即a是不可赋值的,a = a+1; 是错误的。
当数组名作为函数的参数时,形参数组中的值发生变化,实参数组中的值也会随之发生变化,因为两个指针是指向同一块地址的;实参数组名的固定常量,形参的数组名可以做指针变量处理。比如:
void fun(int arr[], int n){
arr = arr+1;

printf("%d\n", *arr);

}
其中arr在函数内部是可以赋值的。

回答2:

数组是实际上指针的语法糖(即指针才是最原始的) ,仅仅在数组作为形参声明时数组才不可 解读为指针 eg:int func(int a[])
和 int func(int *a)
不同,其余情况都可 进行 指针 和数组的转换:即 a[i]=*(a+i)
一般 数组用于存储接收,而指针则用于 调用相关元素。当然两者都有前面的功能。
不知 清楚了没?

回答3:

首先看数组初始化。 int a[8]={1}; printf("[%d,%d,%d]/n",a[0],a[1],a[2]); 数组必须在声明时定义其大小,否则会出错 int a[]; //错误 这种没有指定大小的数组,可以如下初始化; int a[]={1,2,3}; char a[]="afasfsafsafsaf"; 这种没有指定大小的数组,编译器会根据初始化生成大小。 printf("size%d,%d/n",sizeof(a),sizeof(b)); 显然数组声明是个数组结构不光是指针。 看看下面这段代码: int a[]={1,1,1,1}; void SetArray(int a[]) void SetArray(int*a) 这两个有区别么?作为参数时当然没有区别都是指针了。