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;
}

原文地址:https://www.cnblogs.com/liujiaxin2018/p/14827777.html