分享
 
 
 

函数的传递的参数是原参数的副本

王朝other·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

函数的传递的参数是原参数的副本

使用C语言编程,不可能不用到函数,但是函数的参数传递,我们是否真的清楚了呢。本文主要介绍C语言中函数传递的参数。。

函数的参数通常分为两种,普通变量,指针变量。这些参数,将会被函数体调用,当让,也可以传入一些永远不被函数调用的参数,就像你声明了一些变量,却永远不用一样,在语法上是没有问题的。

那么,函数体内调用的传递过来的参数,与原来的参数有什么关系呢?

函数体内接收到的参数,是原参数的副本。

1. 普通变量在函数中的传递 首先我们来看普通变量,函数体内的参数为该普通变量的拷贝副本。下面是一个例子的源程序:

#include <stdio.h>

#include <stdlib.h>

int test(int t1, int t2);

int main(int argc, char *argv[])

{

int t1 = 10;

int t2 = 0;

printf("[main]t1: %d\tt1:%x\n", t1, &t1);

printf("[main]t2: %d\tt2:%x\n", t2, &t2);

test(t1, t2);

printf("[main]t1: %d\tt1:%x\n", t1, &t1);

printf("[main]t2: %d\tt2:%x\n", t2, &t2);

system("PAUSE");

return 0;

}

int test(int t1, int t2)

{

printf("in func....\n");

printf("[test]t1: %d\tt1:%x\n", t1, &t1);

printf("[test]t2: %d\tt2:%x\n", t2, &t2);

t2 = t1;

printf("[test]after t2 = t1\n");

printf("[test]t1: %d\tt1:%x\n", t1, &t1);

printf("[test]t2: %d\tt2:%x\n", t2, &t2);

printf("in func over....\n");

return 1;

}

执行结果为:

[main]t1: 10 t1:22ff7c

[main]t2: 0 t2:22ff78

in func....

[test]t1: 10 t1:22ff60

[test]t2: 0 t2:22ff64

[test]after t2 = t1

[test]t1: 10 t1:22ff60

[test]t2: 10 t2:22ff64

in func over....

[main]t1: 10 t1:22ff7c

[main]t2: 0 t2:22ff78

(打印的地址值可能与我获得的结果不同。)

可以看到,t1和t2,在被test函数调用前后,其值和地址都未变化。而在test函数中,t1和t2的地址与main函数中并不相同,其只是原来的t1和t2的拷贝副本。对副本作的一切操作,都不会影响到test函数外的原来的参数。

2. 指针变量在函数中的传递 指针作为变量在函数传递中,有些特殊,对于普通变量,函数传递的是对其的一份拷贝的副本,而对于指针,函数传递的是对其存放地址的一份拷贝,该拷贝存放的地址与原来的指针所存的地址一致。

我们来看看例子程序:

#include <stdio.h>

#include <stdlib.h>

int test(char *t1, char *t2);

int main(int argc, char *argv[])

{

char t1[] = "kdsfkasdfkdsf";

char *t2 = NULL;

printf("[main]t1: %s\tt1:%x\t&t1:%x\n", t1, t1, &t1);

printf("[main]t2: %s\tt2:%x\t\t&t2:%x\n", t2, t2, &t2);

test(t1, t2);

printf("[main]t1: %s\tt1:%x\t&t1:%x\n", t1, t1, &t1);

printf("[main]t2: %s\tt2:%x\t\t&t2:%x\n", t2, t2, &t2);

system("PAUSE");

return 0;

}

int test(char *t1, char *t2)

{

printf("in func....\n");

printf("[test]t1: %s\tt1:%x\t&t1:%x\n", t1, t1, &t1);

printf("[test]t2: %s\tt2:%x\t\t&t2:%x\n", t2, t2, &t2);

t2 = t1;

printf("[test]after t2 = t1\n");

printf("[test]t1: %s\tt1:%x\t&t1:%x\n", t1, t1, &t1);

printf("[test]t2: %s\tt2:%x\t&t2:%x\n", t2, t2, &t2);

printf("in func over....\n");

return 1;

}

输出结果为:

[main]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff68

[main]t2: (null) t2:0 &t2:22ff64

in func....

[test]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff40

[test]t2: (null) t2:0 &t2:22ff44

[test]after t2 = t1

[test]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff40

[test]t2: kdsfkasdfkdsf t2:22ff68 &t2:22ff44

in func over....

[main]t1: kdsfkasdfkdsf t1:22ff68 &t1:22ff68

[main]t2: (null) t2:0 &t2:22ff64

(打印的地址值可能与我获得的结果不同。)

可以看到,在main函数中,t1、t2所存放的地址,以及该地址对应的字符串的值,与test函数中传递的t1、t2完全一样,但t1、t2的地址却完全不同,

l 故指针在函数中传递的是其地址的一份拷贝,可以在函数体内,修改指针存放的地址对应的值,其修改在函数体外对原参数同样有效,因为原参数也指向该地址。

l 指针在函数体内可修改其所存放的地址,但其修改对函数体外原指针参数无效,因为其只是原指针参数的地址副本,原指针依然指向原来的地址。

3. 使用指针的指针在函数体内修改指针所指对象 如果一定要修改指针参数所指的地址,应该怎么作呢?这时,我们需要用到指针的指针了。请看例子程序:

#include <stdio.h>

#include <stdlib.h>

int test(char **t1, char **t2);

int main(int argc, char *argv[])

{

char *t1 = "tttt";

char *t2 = NULL;

printf("[main]t1: %s\tt1:%x\t&t1:%x\n", t1, t1, &t1);

printf("[main]t2: %s\tt2:%x\t&t2:%x\n", t2, t2, &t2);

test(&t1, &t2);

printf("[main]t1: %s\tt1:%x\t&t1:%x\n", t1, t1, &t1);

printf("[main]t2: %s\tt2:%x\t&t2:%x\n", t2, t2, &t2);

//printf("[main]t2: %s\n", t2);

system("PAUSE");

return 0;

}

int test(char **t1, char **t2)

{

printf("[test]in func....\n");

printf("[test]*t1: %s\tt1:%x\n", *t1, t1);

printf("[test]*t2: %s\tt2:%x\n", *t2, t2);

*t2 = *t1;

printf("[test]after *t2 = *t1\n");

printf("[test]*t1: %s\tt1:%x\n", *t1, t1);

printf("[test]*t2: %s\tt2:%x\n", *t2, t2);

printf("[test]in func over....\n");

return 1;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有