29-指针的练习(包含指针的使用场景)

 

本节知识点:

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\n", a,  b);
32     
33     // 1.调用swap函数
34     swap(a, b);
35     // 值传递无法改变函数外部的值, 因此无法使变量的值对换位置
36     printf("调用swap交换之后:a = %d, b = %d\n", a,  b);
37     
38     // 2.调用swap1函数
39     swap1(&a, &b);
40     // 地址传递, 但是只是改变了指针指向, 没有改变所指向存储空间的内容
41     printf("调用swap1交换之后:a = %d, b = %d\n", a,  b);
42     
43     // 3.调用swap2函数
44     swap2(&a, &b);
45     // 地址传递, 通过*p和*q完成了值交换
46     printf("调用swap2交换之后:a = %d, b = %d\n", 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("请输入两个整数(用逗号隔开):\n");
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\n", a, b, he);
42     printf("差: %d - %d = %d\n", a, b, cha);
43     printf("积: %d * %d = %d\n", a, b, ji);
44     printf("商: %d / %d = %.2f\n", a, b, shang);
45     //printf函数打印 % 字符要用 %% 才能打印
46     printf("余: %d %% %d = %.2f\n", a, b, yu);
47     
48     return 0;
49 }

 输出结果为:

posted @ 2014-10-02 16:33  微雨独行  阅读(499)  评论(0编辑  收藏  举报
1 2