c语言参数传递

使用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;
  }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值