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

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

       使用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:22ff 7c

[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:22ff 7c

[main]t2: 0     t2:22ff78

 

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

       可以看到,t1t2,在被test函数调用前后,其值和地址都未变化。而在test函数中,t1t2的地址与main函数中并不相同,其只是原来的t1t2的拷贝副本。对副本作的一切操作,都不会影响到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函数中,t1t2所存放的地址,以及该地址对应的字符串的值,与test函数中传递的t1t2完全一样,但t1t2的地址却完全不同,

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;

}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值