在调用函数的时候,传参中的变量、一级指针和二级指针的关系

#include <stdio.h>

void  func1(int temp)
{
	printf("进入函数使用 int temp的变量传参数:\n");
	printf("进入函数变量传参数的		变量空间在%x,变量值是%x\n", &temp, temp);
	temp = 2;
	printf("改变函数中变量的值,现在	变量空间在%x,变量值是%x\n", &temp, temp);
}
void  func2(int *temp)
{
	printf("进入函数使用 int *temp的变量传参数:\n");
	printf("进入函数变量传参数的		变量空间在%x,变量值是%x,指向地址的值是%x\n", &temp, temp, *temp);
	*temp = 2;
	printf("改变函数中变量的值,现在	变量空间在%x,变量值是%x,指向地址的值是%x\n", &temp, temp, *temp);
}
void  func3(int *temp)
{
	int *flash;
	printf("进入函数使用 int *temp的变量传参数:\n");
	printf("进入函数变量传参数的			变量空间在%x,指针值是%x,指向地址的值是%x\n", &temp, temp, *temp);
	flash = (int *)malloc(sizeof(int));
	*flash = 3;
	printf("进入函数申请一个变量空间flash,		变量空间在%x,指针值是%x,指向地址的值是%x\n", &flash, flash, *flash);
	temp = flash;
	printf("改变函数中一级指针的指针值,现在	变量空间在%x,指针值是%x,指向地址的值是%x\n", &temp, temp, *temp);
}
void  func4(int** temp)
{
	int* flash;
	printf("进入函数使用 int **temp的变量传参数:\n");
	printf("进入函数变量传参数的		二级指针地址%x,一级指针地址在%x,指针地址是%x,指向地址的值是%x\n", &temp, temp, *temp, **temp);
	flash = (int*)malloc(sizeof(int));
	*flash = 3;
	printf("进入函数申请一个一级指正flash,	变量空间在%x,指针值是%x,指向地址的值是%x\n", &flash, flash, *flash);
	*temp = flash;
	printf("改变函数中变量的值,现在	二级指针地址%x,一级指针地址在%x,指针地址是%x,指向地址的值是%x\n", &temp,  temp, *temp, **temp);
}
//#define no_this
#if defined(no_this)
int pointer_main()
#else 
int main()
#endif
{
	int var = 8;
	int *pt = &var;
	int **pt2 = &(pt);
	printf("这个窗口是让你理解二级指针,一级指针和变量,在调用函数的时候的关系:\n\n");
	printf("1)一级指针和变量在函数调用的关系如下:\n");
	printf("申请变量var的			变量空间在%x,变量值是%x\n\n", &var, var);
	func1(var);
	printf("返回函数后,变量var的		变量空间在%x,变量值是%x\n\n", &var, var);
	func2(&var);
	printf("返回函数后,变量var的		变量空间在%x,变量值是%x\n\n\n", &var, var);

	printf("2)二级指针和一级指针在函数调用的关系如下:\n");
	printf("申请一级指针*pt的			变量空间在%x,指针值是%x,指向地址的值是%x\n\n", &pt, pt, *pt);
	func3(pt);
	printf("返回函数后,一级指针*pt的		变量空间在%x,指针值是%x,指向地址的值是%x\n\n", &pt, pt, *pt);

	printf("申请二级指针**pt的		二级指针地址%x,一级指针的地址在%x,指针地址是%x,指向地址的值是%x\n\n", &pt2, pt2, *pt2, **pt2);
	func4(pt2);
	printf("返回函数后,二级指针**pt的	二级指针地址%x,一级指针的地址%x,指针地址是%x,指向地址的值是%x\n\n", &pt2, pt2, *pt2, **pt2);
	while (1);
}

 

       这样就可以很清楚的看到,在调用函数的时候,如果你想改变变量,你就要传一级指针。如果要改一级指针,你就要传二级指针进去。

      原因是调用函数的时候,他会创建一个空间把对应值拷贝过来,就出现了值相同,地址不同的情况。

     备注)橙色是进入函数会变的地址,蓝色表示拷贝过来不变的值,绿色通过访问内存地址后我们操作的操作数。

      1)在传入变量的时候,函数会拷贝值到另一个地址,那么这时候你修改值,就都是那个函数拷贝后地址的值。

       2)在传入一级指针,虽然一级指针地址变了,但是一级指针的值不变,还是指向同一个变量,这样我们通过这个不变的值来访问这个地址,就可以修改这个变量了。

      3)传入二级指针,主要是在一级指针上操作,比如malloc的申请的函数;传入二级指针,二级指针的的地址肯定变了,二级指针的值不变,通过范围二级指针的值,来修改一级指针的值;

总结,需要在函数里面操作什么,就需要加高一级的指针传入,然后通过高一级指针值不变,访问我们要操作的地址进行操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值