当函数的形参类型是指针类型时,是使用该函数时,需要传递指针,或者地址,或者数组给该形参,举例说明:
案例1 - 传地址或指针给指针变量
代码展示
#include <stdio.h>
void test2(int *p); //函数声明,接收 int *
void main() {
int num=90;
int *p = # //将 num 的地址赋给 p
test2(&num); //传地址
printf("\nmain() 中的 num=%d", num); // num = 91
test2(p); //传指针
printf("\nmain() 中的 num=%d", num);// num = 92
}
void test2(int *p) {
*p += 1; //*p 就访问 num 的值
}
第一次传递时:传递了&num,但是&num也是指针类型,故成立,第二次传递时,传递了p ,p也是指针类型,还是成立,所以第一个结果为91,第二个结果为92
结果:
案例 2-传数组给指针变量
数组名本身就代表该数组首地址,因此传数组的本质就是传地址。
代码演示
#include <stdio.h>
/* 函数声明 */
double getAverage(int *arr, int size); //函数声明
double getAverage2(int *arr, int size); //函数声明
int main (){
/* 带有 5 个元素的整型数组 */
int balance[5] = {1000, 2, 3, 17, 50};
double avg; /* 传递一个指向数组的指针作为参数 */
avg = getAverage( balance, 5 ) ;
/* 输出返回值 */
printf("Average value is: %f\n", avg );
return 0;
}
//说明
//1. arr 是一个指针,
double getAverage(int *arr, int size) {
int i, sum = 0;
double avg;
for (i = 0; i < size; ++i) {
// arr[0] = arr + 0
// arr[1] = arr + 1 个 int 字节(4)
// arr[2] = arr + 2 个 int 字节(8)
//... sum += arr[i];
// arr[0] =>数组第一个元素的地址 arr[1]
sum += arr[i];// arr[0] =>数组第一个元素的地址 arr[1]
printf("arr 存放的地址=%p\n", arr); //存放的是数组的首个数的地址值,并没有进行arr的自增操作,只会存放首地址值。
}
avg = (double)sum / size;
return avg;
}
//arr存放数组, size,存放个数
double getAverage2(int *arr, int size) {
int i, sum = 0;
double avg;
for (i = 0; i < size; i++) {
sum += *arr;
printf("arr 存放的地址=%p\n", arr);
arr++; // 指针的++运算, 会对 arr 存放的地址做修改 (每次自增,增加了4个字节)
}
avg = (double)sum / size; //总和除以个数
return avg;
}
getAverage函数结果:
getAverage2函数结果:
思路题
如果在 getAverage()函数中,通过指针修改了数组的值,那么 main 函数的 balance 数组的值是否会相应变化?
会的 因为 getVerage 函数中的指针,指向的就是 main 函数的数组.