文章转载请注明出处,加上原文链接,谢谢!https://blog.csdn.net/weixin_46959681/article/details/111145714
使用函数实现数组传参
#include <stdio.h>
//数组传参时,形式参数中大小规定是必须的吗?
void arrayPrint(int datas[3])
{
printf("数组datas[3]的大小是 %ld\n", sizeof(datas[3]));
printf("数组datas[3]中一个元素大小是 %ld\n", sizeof(datas[0]));
}
int main(){
int array[3] = {1, 2, 3};
printf("数组array的大小为 %ld\n", sizeof(array));
printf("数组array的元素个数为 %ld\n", sizeof(array)/sizeof(array[0]));
putchar('\n');
arrayPrint(array);
//使用数组名和数组第一个元素为什么能实现相同的效果?
arrayPrint(&array[0]);
return 0;
}
运行结果:
数组array1的大小为 12
数组array1的元素个数为 3
数组datas[3]的大小是 4
数组datas[3]中一个元素大小是 4
数组datas[3]的大小是 4
数组datas[3]中一个元素大小是 4
注意: 结尾处的第一句程序传递的是数组名,第二句程序语句传递的是数组的第一个元素地址。但是两者在函数 arrayPrint()
里的实现是一致的。
根据程序运行的结果,我们可以自然的提出下面两个问题:
- 使用数组名和数组第一个元素为什么能实现相同的效果?
- 数组传参时,形式参数中大小规定是必须的吗?
|1. 使用数组名和数组第一个元素为什么能实现相同的效果?
arrayPrint(array);
arrayPrint(&array[0]);
从数组 array
在计算机内存中的存储而特点而言,数组是有限个同类型变量的有序排列集合 ,其数据按顺序存储在内存的连续空间内(参考笔者的上一篇博文:数组 [1] —— 对比、实现和寄存器)。不论是数组名 array
又或是取数组的第一个元素 &array[0]
,都仅仅是指向数组第一个元素的 地址。 在这个意义上,使用 for
循环遍历数组才顺理成章。
|2. 数组传参时,形式参数中大小规定是必须的吗?
从封装的函数 arrayPrint()
层面而言,形式参数中的数组仅仅只是一个数组的样子而已,中括号中的代表大小的数字是无效的,该参数仅表示传递参数时的一个地址而已。因此,形参的参数根本不需要设置大小,例如前面代码中的参数 datas[3]
只需要写成 datas[]
就可以了。
int datas[]
虽然是一个形式参数(又是一个局部变量),但是也有自己的内存空间,其作用域仅限于该函数。
函数的参数传递机制涉及到CPU中的程序计数器、栈等相关概念,笔者会在相关博文中讨论,此处略过。
使用数组计算最大值、最小值和平均值
演示代码:
#include <stdio.h>
int main()
{
int i = 0;
int max = 0;
int min = 0;
int sum = 0;
float average;
int array[5] = {0};
//赋值
for(i = 0; i < 5; i++){
printf("请输入第%d个数:\n",i+1);
scanf("%d",&array[i]);
}
//找出最大值,打印结果;
max = array[0];
for(i = 0; i < 5; i++) {
if(max < array[i]){
max = array[i];
}
}
printf("数组最大值为:%d\n",max);
//找出最小值,打印结果;
min = array[0];
for(i = 0; i < 5; i++) {
if(min > array[i]){
min = array[i];
}
}
printf("数组最大值为:%d\n",min);
//计算平均值,打印结果。
for(i = 0; i < 5; i++)
{
sum = sum + array[i];
}
//强制转换成浮点类型。
average = (float)sum/5;
printf("数组的平均值为%f\n",average);
return 0;
}
文章更新记录
- 继上一篇博客后,以龟速完成了。「2020.12.22 16:54」
- 代码格式调整。 「2021.1.18 14:03」
- 代码格式调整。 「2021.2.4 22:32」