本节知识点:
1、指针练习
2、指针的使用场景
-------------------------------------------------------------------------------------------------------------------------------------------
1、指针练习
1 /*
2 使用函数来交换两个变量的值
3 */
4 #include <stdio.h>
5 void swap(int p, int q)
6 {
7 int temp = p;
8 p = q;
9 q = temp;
10 }
11 void swap1(int *p, int *q)
12 {
13 // 这里temp是指针变量, 指针变量p和q传递进来, 赋值操作相当于改变指针的指向
14 int *temp = p; // temp指向p所指向的存储空间
15 p = q; // p指向q所指向的存储空间
16 q = temp; // q指向temp所指向的存储空间(即p所指向的存储空间)
17 }
18 void swap2(int *p, int *q)
19 {
20 // 这里temp是整型变量, 指针变量p和q传递进来, 通过*p和*q获取了它们所指向存储空间的变量值,因而可以改变变量的值, 完成值交换。
21 int temp = *p;
22 *p = *q;
23 *q = temp;
24 }
25 int main(int argc, const char * argv[])
26 {
27 // 定义两个整型变量a, b
28 int a = 10;
29 int b = 20;
30 // 打印a和b
31 printf("交换之前:a = %d, b = %d
", a, b);
32
33 // 1.调用swap函数
34 swap(a, b);
35 // 值传递无法改变函数外部的值, 因此无法使变量的值对换位置
36 printf("调用swap交换之后:a = %d, b = %d
", a, b);
37
38 // 2.调用swap1函数
39 swap1(&a, &b);
40 // 地址传递, 但是只是改变了指针指向, 没有改变所指向存储空间的内容
41 printf("调用swap1交换之后:a = %d, b = %d
", a, b);
42
43 // 3.调用swap2函数
44 swap2(&a, &b);
45 // 地址传递, 通过*p和*q完成了值交换
46 printf("调用swap2交换之后:a = %d, b = %d
", a, b);
47 }
输出结果:
注意:
(1)调用函数swap,属于值传递,在swap函数结束后,内存会释放,不会改变main函数中的a,b的值;
(2)调用函数swap1,属于地址传递,只是改变了指针变量的指向,并没有改变内存单元中的内容;
(3)调用函数swap2,属于地址传递,直接操作地址,改变了指针变量指向的内存单元中的内容(即a,b的值)。
2、指针的使用场景
(1)在函数中访问调用者中的变量
(2)函数返回多个值
1 #include <stdio.h>
2 // 定义一个函数,用于计算两个数的和、差、积、商、以及余数
3 void heAndChaAndJiAndShangAndYu(int num1, int num2, int *he, int *cha, int *ji, float *shang, float *yu)
4 {
5 // 将num1 + num2的结果赋值给指针变量he所指向的存储单元(即(num1 + num2)的结果的存储单元)
6 *he = num1 + num2;
7
8 // 将num1 - num2的结果赋值给指针变量cha所指向的存储单元(即(num1 - num2)的结果的存储单元)
9 *cha = num1 - num2;
10
11 // 将num1 * num2的结果赋值给指针变量ji所指向的存储单元(即(num1 * num2)的结果的存储单元)
12 *ji = num1 * num2;
13
14 // 将num1 / num2的结果赋值给指针变量shang所指向的存储单元(即(num1 / num2)的结果的存储单元)
15 *shang = num1 / num2;
16
17 // 将num1 % num2的结果赋值给指针变量yu所指向的存储单元(即(num1 % num2)的结果的存储单元)
18 *yu = num1 % num2;
19
20 }
21 int main (int argc, const char * argv[])
22 {
23 // 定义整型变量a,b并初始化为0,
24 int a = 0;
25 int b = 0;
26 // 定义整型变量he,cha并初始化为0,ji 初始化为-1
27 // 定义float类型变量shang,yu,并初始化为-1
28 int he = 0, cha = 0, ji = -1;
29 float shang = -1, yu = -1;
30
31 // 提示用户输入两个整数,用逗号隔开
32 printf("请输入两个整数(用逗号隔开):
");
33 // 接收用户输入的两个整数
34 // 此处整形变量前面一定要加取地址运算符&
35 scanf("%d,%d", &a, &b);
36
37 // 调用函数,计算和、差、积、商和余数,这时a,b的值分别传递到函数的形参num1,num2;
38 // he,cha,ji,shang,yu的地址传递给被调函数(地址传递)
39 heAndChaAndJiAndShangAndYu(a, b, &he, &cha, &ji, &shang, &yu);
40
41 printf("和: %d + %d = %d
", a, b, he);
42 printf("差: %d - %d = %d
", a, b, cha);
43 printf("积: %d * %d = %d
", a, b, ji);
44 printf("商: %d / %d = %.2f
", a, b, shang);
45 //printf函数打印 % 字符要用 %% 才能打印
46 printf("余: %d %% %d = %.2f
", a, b, yu);
47
48 return 0;
49 }
输出结果为: