一维数组做函数参数
可以用数组元素做函数参数,还可以用数组名做函数参数(包括实参和形参)
用数组元素做实参时,向形参变量传递的是数组元素的值,而用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
- 用数组名作函数参数,应该在主调函数和被调用函数分别定义数组。
- 用数组名作函数参数,形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号,如
float average(float array[])
- 实参数组和形参数组类型应该一致,如不一致,结果将出错。
- 当用数组名作参数时,如果形参数组中各元素的值发生了变化,实参数组元素的值随之发生改变。
int main()
{
float average(float array[10]);//float average(float array[]);
float score[10],aver;
aver=average(score);
}
float average(float array[10])//float average(float array[])
{
}
上面定义的average函数指定的形参数组的大小10是不起作用的,因为编译系统并不检查形参数组的大小,只是将实参数组的首元素的地址传给形参数组名。数组名代表数组的首元素的地址,因此认为,形参数组首元素(array[0])和实参数组首元素(score[0]具有同一地址,他们共占用同一存储单元,score[n]和array[n]指的是同一单元。score[n]和array[n]具有相同的值。
指针变量做函数参数
函数的参数为指针类型时,他的作用是将一个变量的地址传送到另一个函数中。
- C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。因为传递的值是地址,所以要求形参为指针变量。
- 不可能通过调用函数来改变实参指针变量的值,但是可以改变(而且只可以)改变指针变量所指变量的值。
- 用指针变量做函数参数时,在函数执行过程中使指针变量所指向的变量值发生变化,在函数调用结束后,这些变量值的变化依然保留下来,这样就实现了“通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值”
- 实参数组名代表一个固定的地址,但形参数组名并不是一个固定的地址,而是按指针变量处理。
int a[10],*p;
p=a;
在使用时,要避免使用a++,否则会导致出现错误。可以用`p++`,`a+i`,`&a[i]`代替
- 指针变量引用时一定要指向一个内存单元
int main()
{
float average(float array[10]);//float average(float array[]);
float score[10],aver;
float *p;
p=score; //指针变量一定要初始化(指向一个内存单元)否则会导致出错
aver=average(p);
}
float average(float *x)
{
}
上面这句话解释:如果用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的对象。