先来思考这样一个问题如果有两个变量需要互换其值,应该如何处理?答案非常简单:
#include <stdio.h> int main(int argc, char **args) { int i = 3; int j = 5; int t; t = i; i = j; j = t; printf("i = %d\nj = %d\n", i, j); return 0; }
运行结果:
i = 5 j = 3
如果我们有很多组变量都要做值互换,比如100组变量,我们肯定不能写100次的互换代码,首先方案就是要编写一个具有互换功能的函数swap,这个swap函数通过接收参数的方式将变量互换:
#include <stdio.h> void swap(int m, int n) { int t; t = m; m = n; n = t; } int main(int argc, char **args) { int i = 3; int j = 5; swap(i, j); printf("i = %d\nj = %d\n", i, j); return 0; }
运行结果:
i = 3 j = 5
运行结果错误,i与j的值并没有像我们预想的那样互换。原因是在void swap(int m, int n)中m和n是函数的参数,在main函数执行swap(i, j);时m和n只不过是得到了i和j的值,但m和n并不是i和j本身。当执行m和n互换时,m和n这两个变量的值的确互换了,但i和j并没有任何变化。对于整个程序来说i、j、m、n是4个不同的变量,它们之间没有任何关系。为了解决变量互换的问题,我们需要修改一下代码,将swap的参数修改为指针参数,修改后的程序如下:
#include <stdio.h> void swap(int *m, int *n) { int t; t = *m; *m = *n; *n = t; } int main(int argc, char **args) { int i = 3; int j = 5; swap(&i, &j); printf("i = %d\nj = %d\n", i, j); return 0; }
运行结果:
i = 5 j = 3
这次的结果是正确的,其实m、n和i、j一样都是没有关系的4个变量,但问题的关键是m和n都是指针变量,在调用swap函数时将i和j的地址传入到m和n中,也就是说m的值是i的内存地址,n的值是j的内存地址,在互换代码中并不是对m和n的值进行互换,而是对*m和*n做互换,也就是对m和n中的地址解引用并做互换操作,受到这个操作影响的就是这个地址中的2个变量i和j。于是i和j的值就互换了。
指针做函数参数的好处很大,它允许在函数内部操作其外部的变量内容。同时,当一个函数的参数是指针时我们在编写程序时也要格外的注意,因为在函数内部修改函数外部变量是有一定风险的,要在明确知道函数功能的情况下才能调用这些指针做参数的函数。
再来举一个指针变量做参数的例子,假设我们要给一个2维数组初始化,这个2维数组有5行10列,下面我们就来实现2个函数,init_array能让数组里的所有值都变为指定的数值,show_array能显示出这个数组:
#include <stdio.h> #define MAX_ROW 5 #define MAX_COL 10 void init_array(int *p, int val) { for (int i = 0; i < MAX_ROW; i++) { for (int j = 0; j < MAX_COL; j++) { *p = val; p++; } } } void show_array(int *p) { for (int i = 0; i < MAX_ROW; i++) { for (int j = 0; j < MAX_COL; j++) { printf("%d ", *p++); } printf("\n"); } } int main(int argc, char **args) { int array[5][10]; init_array(array[0], 0); show_array(array[0]); printf("\n"); init_array(array[0], 3); show_array(array[0]); printf("\n"); init_array(array[0], 7); show_array(array[0]); return 0; }
运行结果:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
Copyright © 2015-2023 问渠网 辽ICP备15013245号