11.9 关于我为什么说上章有那么多问题,聚焦于数组在函数传参的时候

发布于 14 天前  20 次阅读


int b(int arr[1]) {
return arr[0];
}

在C语言中,函数参数中的数组声明(例如 int arr[1]实际上会被视为指针。也就是说,int arr[1]int* arr 是等价的。这意味着无论你在函数参数中声明数组的大小是多少,C编译器都会将其视为指向数组首元素的指针

//你就是int arr[99999],它都等价于int *arr

尽管你可以在函数参数中声明一个特定大小的数组(如 int arr[1]),这并不会限制你传递的数组的大小(因此这样做是毫无意义的),你仍然可以传递一个更大的数组(如 int arr[99])。

在函数内部,你可以使用数组下标(如 arr[i])来访问数组元素,这实际上是通过指针进行的。编译器会arr[i] 转换为 *(arr + i),这意味着它在访问数组元素时是通过指针运算来实现的

//重点常识,编译器访问数组元素通过指针来实现

同时,这也意味着如果你在函数内部尝试访问超出实际传递的数组的元素大小,你可能会遇到未定义行为(当然,这是废话)


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int a(int arr[99]) {
	return arr[0];
}

int b(int arr[1] ) {
	return arr[0];
}

int main() {
	int arr[99];
	scanf("%d %d %d", &arr[0], &arr[1], &arr[2]);
	printf("%d %d", a(arr), b(a(arr)));
	return 0;
}

这个代码错就错在数据类型的处理上

我们已经知道,函数a的形参列表里实际等价于int* arr

要返回的arr[0]经过编译器运用指针,返回的就是arr[0]里面实际存储的值

所以函数b所接受到的参数,并不是数组,而是一个整型,这里就会报错

int b(int aa) {
	return aa;
}

这样就是对的

届ける言葉を今は育ててる
最后更新于 2024-11-10