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\n", a); printf("bbbb: %d\n", b); printf("cccc: %d\n", 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\n", 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("\n==================="); swap(&a, &b); //函数调用给与的实参需要是指针,取址运算符+对象, 获取地址,生成指针。 printf("aaaa: %d\n", a); printf("bbbb: %d\n", 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("\na = %d | b = %d\n", a, b); return 0; }