先来思考这样一个问题如果有两个变量需要互换其值,应该如何处理?答案非常简单:
#include
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
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
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
#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
欢迎关注公众号:编程外星人