• 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
    ", 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 }

     输出结果为:

    人生之路,不忘初心,勿忘始终!
  • 相关阅读:
    如何让研发团队保持敏捷并不断进步?
    敏捷方法适合什么样的团队?
    规模化敏捷中的“三要”和“三不要”
    敏捷开发中如何使用看板方法创造价值
    4.0 初步预计更新内容
    3.0 环境应用(待更新)
    5.0 Genymotion安装以及基础使用
    2.0 python+appium环境搭建
    1.0 python-client以及ui自动化介绍
    教你一招另辟蹊径抓取美团火锅数据
  • 原文地址:https://www.cnblogs.com/xdl745464047/p/4004202.html
Copyright © 2020-2023  润新知