C语言中的指针-指针变量作为函数参数-学习笔记-25

指针变量作为函数参数

我们说过,函数参数可以是变量,那么既然指针变量也是变量的一种,能否作为函数的参数呢?答案是肯定的!而指针变量作为函数参数的主要作用是,将变量地址传送到函数中。

从例子引入

我们通过两个使用指针变量作为函数参数的例子,来引入我们今天的内容。

问题

输入两个数,返回其中的较大者,设计一个自定义函数进行比较,要求使用指针变量作为函数参数。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main(){
int a, b;
int abmax(int * pointer_1, int * pointer_2);
//声明了一个指针变量作为参数的函数
int * a_pointer, * b_pointer;
printf("请输入两个数:\n");
scanf("%d %d",&a,&b);
a_pointer=&a;
b_pointer=&b;
//给指针变量赋值
printf("%d 和 %d 中较大的是:%d\n",a,b,abmax(a_pointer, b_pointer));
return 0;
}

int abmax(int *pointer_1, int *pointer_2){
if (*pointer_1>*pointer_2){
//接收到指针变量的地址后,对比该地址的数据内容
return (*pointer_1);
}else{
return (*pointer_2);
}
}

因为 a_pointer 这个指针变量存放着变量 a 的内存地址,所以我们传递给函数后,形参里面的*pinter_1就是变量 a。
我们把上面的代码修改一下,不改变变量名的情况下,输出最大值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main(){
int a,b;
int *a_pointer,*b_pointer;
void swap(int *pointer_1, int *pointer_2);
a_pointer=&a;
b_pointer=&b;
printf("请输入两个数:\n");
scanf("%d %d",&a,&b);
if(a<b){
swap(a_pointer, b_pointer);
}
printf("最大的是:%d,最小的是:%d\n",a,b);
return 0;
}

void swap(int *pointer_1, int *pointer_2){
int temp;
temp=*pointer_2;
*pointer_2=*pointer_1;
*pointer_1=temp;
}

我们观察到 a 和 b 的变量名没有改变,但却能够根据数的大小输出正确的结果,这里我们就要好好理一理这个思路了。

从指针角度来看变量包括3部分:

  1. 变量名
  2. 变量名指向的数据
  3. 变量名指向的数据的地址

上面的例子中,我们知道主调函数只能向被调函数单向传递数据到形参,形参发生改变,函数结束后形参就释放了,不能影响到实参,但是在这里,我们形参传递过去的是地址,形参通过地址找到真是的数据,然后改变这些数据,这些操作是真是有效的。所以,我们在变量名不变的情况下,将变量名指向的数据对调了,所以变量名还是那个变量名,地址还是那个地址,但是里面的被我们调包了。这就是指针的灵活性所在,变量名、地址、指向的数据三者都可以进行改变,用来达到我们预期的目的。

用例子说明

如何调用一个 void 函数,即函数不返回任何值的前提下,改变两个变量的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main(){
int a,b,c;
int *a_pointer,*b_pointer,*c_pointer;
void swap(int *pointer_1, int *pointer_2);
printf("请输入三个数:\n");
scanf("%d %d %d",&a,&b,&c);
a_pointer=&a;
b_pointer=&b;
c_pointer=&c;
if(a<b){swap(a_pointer,b_pointer);}
if(a<c){swap(a_pointer,c_pointer);}
if(b<c){swap(b_pointer,c_pointer);}
printf("%d %d %d",a,b,c);
}

void swap(int *pointer_1, int *pointer_2){
int temp;
temp=*pointer_1;
*pointer_1=*pointer_2;
*pointer_2=temp;
}

上面解答的精髓就是,我们通过一个自定义函数,接收到了需要改变变量的地址,然后通过地址找到了变量指向的数据,直接修改了数据内容,达到了变量和地址不变,内容交换的效果。
这也是指针作为函数参数最主要的通途。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!