## 数组和函数 - 数组可以作为函数的参数使用,数组用作函数参数有两种形式: - 一种是把数组元素作为实参使用 - 一种是把数组名作为函数的形参和实参使用 ------ ## 数组元素作为函数参数 - 数组的元素作为函数实参,与同类型的简单变量作为实参一样,如果是基本数据类型, 那么形参的改变不影响实参 ```c void change(int val)// int val = number { val = 55; } int main(int argc, const char * argv[]) { int ages[3] = {1, 5, 8}; printf("ages[0] = %d", ages[0]);// 1 change(ages[0]); printf("ages[0] = %d", ages[0]);// 1 } ``` > - 用数组元素作函数参数不要求形参也必须是数组元素 ------ ## 数组名作为函数参数 - 在C语言中,数组名除作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作函数参数时,实参与形参之间不是"值传递",而是"地址传递" - 实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元, 系统不再为形参数组分配存储单元 - 既然两个数组共享一段内存单元, 所以形参数组修改时,实参数组也同时被修改了 ```c void change2(int array[3])// int array = 0ffd1 { array[0] = 88; } int main(int argc, const char * argv[]) { int ages[3] = {1, 5, 8}; printf("ages[0] = %d", ages[0]);// 1 change(ages); printf("ages[0] = %d", ages[0]);// 88 } ``` ------ ## 数组名作函数参数的注意点 - 在函数形参表中,允许不给出形参数组的长度 ```c void change(int array[]) { array[0] = 88; } ``` - 形参数组和实参数组的类型必须一致,否则将引起错误。 ```c void prtArray(double array[3]) // 错误写法 { for (int i = 0; i < 3; i++) { printf("array[%d], %f", i, array[i]); } } int main(int argc, const char * argv[]) { int ages[3] = {1, 5, 8}; prtArray(ages[0]); } ``` - 当数组名作为函数参数时, 因为自动转换为了指针类型,所以在函数中无法动态计算除数组的元素个数 ```c void printArray(int array[]) { printf("printArray size = %lu\n", sizeof(array)); // 8 int length = sizeof(array)/ sizeof(int); // 2 printf("length = %d", length); } ``` - 练习: - 设计一个函数int arrayMax(int a[], int count)找出数组元素的最大值 - 从键盘输入3个0-9的数字,然后输出0~9中哪些数字没有出现过 - 要求从键盘输入6个0~9的数字,排序后输出 ### 捐赠支持 项目的发展离不开你的支持,如果 **CNote** 帮助到你打开编程的大门,请作者喝杯咖啡吧 ☕ 后续我们会继续完善更新!加油! [点击捐赠支持作者](https://www.yuque.com/docs/share/25942927-f732-4f94-a670-154a9c7b06d3) 最后,如果有任何疑问,请加微信 leader_fengy 拉你进学习交流群。 开源不易,码字不易,如果觉得有价值,欢迎分享支持。