zoukankan      html  css  js  c++  java
  • c语言中指针与函数:作为参数的指针、求和与差、两值交换、两值排序

    在c语言程序中,指针的一个重要作用就是作为函数的参数。 

    001:指针作为参数可以解决对传入到函数中的变量进行修改的目的。

    如果要在函数中修改变量的值,就需要传入该变量的指针,然后再函数体中使用指针运算符,这样就获取了原始对象的别名,在函数体中对别名进行修改,就相当于对原始对象进行修改。

    间接访问运算符:指针运算符*又叫做间接访问运算符,因为在指针前使用指针运算符,可以间接访问指针指向的对象。

    解引用:利用指针运算符间接访问指针指向的对象,称为解引用。

    1、修改变量的值

    程序示例:

    #include <stdio.h>
    
    void modify(int *x) //此处为指针变量声明,用于高速函数,接收的参数为指针。指针变量声明方式:数据类型 + 指针运算符* + 变量名 
    {
        if(*x < 200)   // 在函数体中使用指针运算符+指针,相当于该指针指向的对象的别名,对别名进行修改,相当于对原始对象进行修改,实现对传入的变量的修改 
            *x = 500;    
    } 
    
    int main(void)
    {
        int a = 100;
        int b = 150;
        int c = 300;
         
        modify(&a);  //调用函数时,实参给与的需要是指针,取址运算符+对象名可以获取对象的地址,生成指针。 
        modify(&b);
        modify(&c);
        
        printf("aaaa:  %d
    ", a);
        printf("bbbb:  %d
    ", b);
        printf("cccc:  %d
    ", c);
        
        return 0;
    }

    要想对传入到函数中的变量进行修改,函数的形参部分要声明为指针变量(数据类型+指针运算符*+变量名),告诉程序传入的参数为指针,而在函数体中使用指针运算符

    +指针,相当于获取了指针指向的对象,即该对象的别名,对这个别名进行修改,相当于对原始对象就进行修改。而在函数调用部分,给与的实参应该是指针,即使用

    取址运算符+对象的形式,用于获取对象的地址,生成指针。

    2、 计算两个数的和与差

    #include <stdio.h>
    
    void sum_diff(int x, int y, int *sum, int *diff)  //指针变量的形参声明, 数据类型+指针运算符*+变量名 
    {
        *sum = x + y;   //指针运算符 + 指针, 获取指针指向对象的别名,对别名进行修改 
        *diff = (x > y) ? (x - y) : (y - x);
    }
    
    int main(void)
    {
        int a, b;
        int wa = 0, sa = 0;
        puts("please input two integers.");
        printf("a  =  "); scanf("%d", &a); 
        printf("b  =  "); scanf("%d", &b);
        
        sum_diff(a, b, &wa, &sa);  // 函数调用需要传入指针,使用取址运算符+对象,获取地址,生成指针。 
        
        printf("wa: %d || sa: %d
    ", wa, sa);
        return 0; 
    }

    要想对传入函数的变量进行修改,需要传入该变量的指针,然后再函数体中使用指针运算符+指针获取该变量的别名,对别名进行修改,相当于对原始变量进行修改。

    需要进行指针变量声明,调用需要传入的实参为指针,使用取址运算符&+对象(变量)获取。

    3、交换两个数的值

    如果要在函数中修改变量的值,就需要传入指向该变量的指针,然后再函数体中使用指针运算符+指针,获得该变量的别名,对别名进行修改,就相当于对原始变量进行

    修改了。

    函数定义:形参:指针变量声明,数据类型+指针运算符*+变量名,告诉函数传入的参数需要是指针。

    函数调用:实参:需要给与指针作为实参,使用取址运算符&+变量,获取变量的地址,生成指针。

    交换两个数的值:

    #include <stdio.h>
    
    void swap(int *x, int *y) //形参声明,指针变量声明,告诉程序接受的参数为指针,指针变量声明方式:数据类型+指针运算符*+变量名 
    {
        int tmp;
        tmp = *x;  //指针运算符+指针,或者指针指向的对象,即指针指向的对象的别名,对别名进行修改,相当于对原始对象进行修改。 
        *x = *y;
        *y = tmp;    
    } 
    
    int main(void)
    {
        int a, b;
        puts("please input two integers.");
        printf("a = "); scanf("%d", &a);
        printf("b = "); scanf("%d", &b);
        
        puts("
    ===================");
        
        swap(&a, &b);  //函数调用给与的实参需要是指针,取址运算符+对象, 获取地址,生成指针。 
        
        printf("aaaa:  %d
    ", a);
        printf("bbbb:  %d
    ", b);
         
        return 0;
    }

    要想对传入函数中的变量进行修改,需要传入该变量的指针(形参声明为指针变量,实参给与指针), 在函数体中使用指针运算符+指针,相当于获取了获取该对象的

    别名,对别名的修改,会返回至主调用函数。

    4、对两个数排序

    #include <stdio.h>
    
    void swap2(int *x, int *y) //指针变量声明(形参声明), 数据类型+指针运算符*+变量名,定义函数接受的参数类型 
    {
        int tmp;
        tmp = *x;  //函数体中使用 指针运算符*+指针,获取传入的变量的别名,对别名进行修改,会返回至主调用函数 
        *x = *y;
        *y = tmp;
    }
    
    void sort(int *n1, int *n2)  //指针变量声明,声明形参为指针 
    {
        if(*n1 > *n2)  //函数体中使用指针运算符+指针,返回该指针指向的对象,相当于该对象的别名,修改别名,返回至原始对象 
            swap2(n1, n2);  // 此处给与实参不用使用取址运算符了,因为n1、n2进过sort的传递,已经是指针了。 在main函数中需要使用取址运算符&,是因为在对象前使用取址运算符,才生成指针。 
    }
    
    int main(void)
    {
        int a, b;
        puts("please input two integers.");
        printf("a = "); scanf("%d", &a);
        printf("b = "); scanf("%d", &b);
        
        sort(&a, &b);  //此处要使用取址运算符,获取地址,生成指针,将指针作为实参传递给形参。 
        
        printf("
    a = %d | b = %d
    ", a, b);
        
        return 0;
    }

  • 相关阅读:
    VMware虚拟机下Centos8 设置静态IP地址
    maven插件使用及dockerfile插件多模块下打包
    Docker开启远程访问、IDEA Docker 连接 linux 上的 Docker
    Docker打包错误:Failed to execute goal com.spotify:docker-maven-plugin:1.2.0:build (default-cli) on project security
    Idea 中 Docker 的 log 乱码
    oracle11G 已开启监听,但远程连接依旧无监听解决过程
    sql server特殊功能:临时表是否存在
    sql server object_id()的应用
    sql server系统表详细说明
    SQL行转列汇总
  • 原文地址:https://www.cnblogs.com/liujiaxin2018/p/14827777.html
Copyright © 2011-2022 走看看