Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102449
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-22 10:44
文章分类

全部博文(23)

文章存档

2018年(3)

2017年(1)

2015年(1)

2014年(18)

我的朋友

分类: C/C++

2014-07-24 22:18:45

C语音中传值和传址都是针对函数的参数而言的,传值的目的是传给函数一个实际的数值,而传址的目的一个是为了带入一个简洁的参数,另一个目的是为了修改带入的参数。
下面引入一传值的例


  1. /*计算两个整数的和 示例1*/
  2. int add(int a, int b)
  3. {
  4.     return (+ b)            
  5. }    
示例1为一个传值的函数,功能是为了获取两个整数的和,这时,我们可以利用函数的返回值来获取两个整数的和。

同样我们也可以用传址的方式,传址:即传参数的地址(指针)


点击(此处)折叠或打开

  1. /*示例2*/
  2. int add(int *a, int *b)
  3. {
  4.     return (*+ *b);
  5. }
示例2为一个传址的函数,功能同示例1.

传址和传值在某些时候是完全可以互相取代的,但是为什么有些函数必须使用传址的方式呢 ?
在初学C语言时,我也有同样的困惑,不知道何时传
现在总结一些自己浅薄的经验与大家分享一下
1、数组作为函数参数需要使用传址(指针)
            可以想一下,如果一个数组有10个值,而且在函数中使用这数组中的10个数据,使用传值得方式需要将数组的十个值都作为参数传入才行,这样函数的参数过多一是代码不简洁,二是传入的每个参数都是在栈中保存的,容易导致栈溢出。

点击(此处)折叠或打开

  1. /*计算两个数组的和,并返回 示例3*/
  2. int add(int *a, int array_a_len, int *b, int array_b_len)
  3. {
  4.     int i ;
  5.     int sum = 0;
  6.     for(i = 0; i < array_a_len; i++)
  7.         sum += *(a + i);
  8.     for(i = 0; i < array_b_len; i++)
  9.         sum += *(b +i);    
  10.     return sum;
  11. }

  12. int main(int argc, char **argv)
  13. {
  14.     int array_a[10]={1,2,3,4,5,6,7,8,9,10};
  15.     int array_b[10]={20,30,40,50,60,70,80,90,100,10};
  16.     int sum = 0;

  17.     sum = add(a,10,b,10);
  18.     return 0;
  19. }
设想一下如果是将两个数组的值都带入函数,那么函数的参数有20个,使用指针将数组的首地址和数组的大小传入,就可以使用add函数自动计算了。

2、字符串作为函数参数使用传址(指针)

符串作为参数时就需要使用指针将字符串的首地址传入,然后在函数中进行遍历。

3、结构体当作参数传入函数时,需要使用传址(指针)
一般工程比较小时,并不会发现我们定义的结构体有多大,但是真的大型的项目上一个结构题可能会占用5K剩至更大的的内存,如果此时传入结构体的整个数据结构,那么栈溢出的可能性会和大,
所以我们选择将结构体的首地址传入,使用指针也是可以访问结构体中的每个成员的,而且可以修改结构体中的成员。

点击(此处)折叠或打开

  1. struct pval
  2. {
  3.    char head[4094];
  4.    int len;
  5.    ....//省略其他参数
  6. };

  7. int add_para(struct pval *val)
  8. {
  9.     val->head[0] = ‘h’;
  10.     val->head[1] = ‘e‘;   
  11.     val->head[2] = ‘l‘;
  12.     val->head[3] = ‘l‘;
  13.     val->head[4] = ‘o‘;
  14.     val->head[5] = 0;
  15.     val->len = 6;
  16.     return 0;
  17. }

  18. int main(int argc, char **argv)
  19. {
  20.     struct pval p;//定义一个结构体变量
  21.     
  22.     add_para(&p);
  23.     printf("%s\n", p.head);

  24.     return 0;
  25. }
此时打印结果是:hello
我们传址的目的只有两个:一是减少参数的个数(简化参数列表,防止栈溢出,提高代码效率),二是为了修改传入参数的内容。




本文观点只是个人的一些理解,写的不足之处,请大家提出,共同成长。




阅读(1493) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~