c语言指针que->ask,问渠网-C语言深处-第二节 指针参数

先来思考这样一个问题如果有两个变量需要互换其值,应该如何处理?答案非常简单:

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

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果:

i = 5

j = 3

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

如果我们有很多组变量都要做值互换,比如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;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果:

i = 3

j = 5

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果错误,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;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果:

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 

{

for (int j = 0; j 

{

*p = val;

p++;

}

}

}

void show_array(int *p)

{

for (int i = 0; i 

{

for (int j = 0; 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;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

运行结果:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值