C语音中传值和传址都是针对函数的参数而言的,传值的目的是传给函数一个实际的数值,而传址的目的一个是为了带入一个简洁的参数,另一个目的是为了修改带入的参数。
下面引入一个传值的例子
-
/*计算两个整数的和 示例1*/
-
int add(int a, int b)
-
{
-
return (a + b)
-
}
示例1为一个传值的函数,功能是为了获取两个整数的和,这时,我们可以利用函数的返回值来获取两个整数的和。
同样我们也可以用传址的方式,传址:即传参数的地址(指针)。
-
/*示例2*/
-
int add(int *a, int *b)
-
{
-
return (*a + *b);
-
}
示例2为一个传址的函数,功能同示例1.
传址和传值在某些时候是完全可以互相取代的,但是为什么有些函数必须使用传址的方式呢 ?
在初学C语言时,我也有同样的困惑,不知道何时传址进去。
现在总结一些自己浅薄的经验与大家分享一下
1、数组作为函数参数需要使用传址(指针)。
可以想一下,如果一个数组有10个值,而且在函数中使用这数组中的10个数据,使用传值得方式需要将数组的十个值都作为参数传入才行,这样函数的参数过多一是代码不简洁,二是传入的每个参数都是在栈中保存的,容易导致栈溢出。
-
/*计算两个数组的和,并返回 示例3*/
-
int add(int *a, int array_a_len, int *b, int array_b_len)
-
{
-
int i ;
-
int sum = 0;
-
for(i = 0; i < array_a_len; i++)
-
sum += *(a + i);
-
for(i = 0; i < array_b_len; i++)
-
sum += *(b +i);
-
return sum;
-
}
-
-
int main(int argc, char **argv)
-
{
-
int array_a[10]={1,2,3,4,5,6,7,8,9,10};
-
int array_b[10]={20,30,40,50,60,70,80,90,100,10};
-
int sum = 0;
-
-
sum = add(a,10,b,10);
-
return 0;
-
}
设想一下如果是将两个数组的值都带入函数,那么函数的参数有20个,使用指针将数组的首地址和数组的大小传入,就可以使用add函数自动计算了。
2、字符串作为函数参数使用传址(指针)。
字符串作为参数时就需要使用指针将字符串的首地址传入,然后在函数中进行遍历。
3、结构体当作参数传入函数时,需要使用传址(指针)。
一般工程比较小时,并不会发现我们定义的结构体有多大,但是真的大型的项目上一个结构题可能会占用5K剩至更大的的内存,如果此时传入结构体的整个数据结构,那么栈溢出的可能性会和大,
所以我们选择将结构体的首地址传入,使用指针也是可以访问结构体中的每个成员的,而且可以修改结构体中的成员。
-
struct pval
-
{
-
char head[4094];
-
int len;
-
....//省略其他参数
-
};
-
-
int add_para(struct pval *val)
-
{
-
val->head[0] = ‘h’;
-
val->head[1] = ‘e‘;
-
val->head[2] = ‘l‘;
-
val->head[3] = ‘l‘;
-
val->head[4] = ‘o‘;
-
val->head[5] = 0;
-
val->len = 6;
-
return 0;
-
}
-
-
int main(int argc, char **argv)
-
{
-
struct pval p;//定义一个结构体变量
-
-
add_para(&p);
-
printf("%s\n", p.head);
-
-
return 0;
-
}
此时打印结果是:hello
我们传址的目的只有两个:一是减少参数的个数(简化参数列表,防止栈溢出,提高代码效率),二是为了修改传入参数的内容。
本文观点只是个人的一些理解,写的不足之处,请大家提出,共同成长。
阅读(1502) | 评论(0) | 转发(0) |