c语言指针的传引用
欢迎关注AWP资讯
当我们想要实现一个如下功能的程序:
在main函数中调用另一个递增函数,实现变量的递增,我们在初学时或小白状态时,可能会写出如下代码:
#include <stdio.h>
void add(int a)
{
a = a+1;
}
void main(void)
{
int a = 10;
add(a);
printf("a = %d\n",a);
}
在我们理解的C语言或程序的运行后我们知道,a的值不会随着add函数递增变为11,最终打印出的值为10,我们运行看一下结果
打印出来的结果是10,并不是我们期望的11。这里留给我们思考的就是这里传的值跑哪去了,要想理解其中的奥妙,首先要明白虽然在main函数中的变量a和add函数中的a同名,但是这两个变量的地址是不同的,这里函数运行时只将值传进去了,而没有改变main函数中变量a的值,这两个变量是不同的变量,分别位于不同的地址空间,所以打印出来的是10。再执行下面一段函数,分别看一下地址和值为多少
#include <stdio.h>
void add(int a)
{
a = a + 1;
printf("add:address a = %d,vaule a = %d\n",&a,a);
}
int main()
{
int a = 10;
add(a);
printf("main:address a = %d,vaule a = %d\n",&a,a);
return 0;
}
从打印结果来看add中的地址和main中的地址是不同的,程序运行时只进行了传值,改变的是不同地址空间上的值,对于main中的变量值仍然没有改变,可以用如下图来表示
两个变量分别在不同的地址上,add函数中的值执行了a+1,a的值变为了11,而main函数中的a没有执行运算,所以还是保持原来的值。那么我们如何才能实现不用返回值调用add函数的功能,这里就可以用指针的传引用来实现,通过指针来传址,代码如下
#include <stdio.h>
void add(int *p)
{
*p =(*p) + 1;//变量地址上的值加1
printf("add:address p = %d,vaule *p = %d\n",p,*p);
}
int main()
{
int a = 10;
add(&a);
printf("main:address a = %d,vaule a = %d\n",&a,a);
return 0;
}
打印结果如下
将变量a的地址传入add函数,add函数对传入的地址上的值进行运算操作,使得这一地址上的值改变,最终可以得到我们想要的+1结果。