值传递与地址传递的区别

以下内容源于网络资源的学习与整理,欢迎交流。

总结

值传递,只是把原参的复制品传给形参,在子函数中修改这个形参,不会改变主函数中的原参。

地址传递,由于形参和原参表示同一个内容,在子函数中修改形参,也会改变主函数中的原参。

代码示例1

#include<stdio.h>

void F1(int *pp)
{
	pp++;
	*pp = 9;
}

void F2(int **pp)
{
	(*pp)++;
}

int* F3(int *pp)
{
	pp++;
	return pp;
}
//以上函数中,接收数据的参量都是pp,而不会是*pp或者**pp

int main(void)
{
	int *p;
	int a[2] = { 4,5 };
	p = a;
	printf("1--------%d\n", *p);//开始值为4

	F1(p);
	printf("2--------%d\n", *p);//4
	//由于只是传值,在子函数F1的内部改变复制品的值,并不会改变原品p的值
	//可以理解为用两个变量指向同一个地址,即形参pp和实参p指向同一个地址
	//其中形参pp++,另外一个实参p并不会受影响
	//但是可以修改指针所指的值,如F1代码中将a[1]的值改为9;
    //经过F1(p)函数后,p依然指向指向a[0],但原来的a[1]=5被修改成a[1]=9
	printf("2`-------%d\n", a[1]);//9


	F2(&p);
	printf("3--------%d\n", *p);//9
	//传址,pp=&p(指针的地址,即pp是指向指针的指针),pp=&p,则*pp=*(&p)=p;
	//如果要修改指针p,则应该传入指针p的地址(&p),\
    //此时进行(*pp)++操作,其实是对实参指针p进行操作

	getchar(); getchar();
	return 0;
}

代码示例2 

#include <stdio.h> 
#include <stdlib.h> 
#include<string.h>
/*void getmemory(char **p)
{
	*p = (char *)malloc(100);
	strcpy(*p, "helloworld");
}

int main()
{
	char* str = NULL;
	getmemory(&str);
	printf("%s", str);
	free(str);
	getchar();
	return 0;
}*/


char* getmemory(char *p)
{
	p = (char *)malloc(100);
	strcpy(p, "helloworld");
	return p;
}
int main()
{
	char* str = NULL;
	str = getmemory(str);
	printf("%s", str);
	free(str);
	getchar();
	return 0;
}

分析说明

如果要在子函数中修改主函数传过来的指针的指向,那么主函数应该向子函数传入指针的地址(而非指针本身);此时在子函数中进行*操作后可以获得原来指针,而不是原来指针的复制品,之后可以根据需要修改指针。

或者,将返回值类型改为指针类型,然后返回修改后的指针,给原来主函数的指针。比如代码示例1中的F3函数,此时在主函数中需要添加p=F3(p)代码;又比如代码示例2。

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
指针值传递地址传递是两种不同的概念。在C语言中,函数参数可以通过值传递地址传递传递给函数。 指针值传递是指将指针变量作为参数传递给函数,函数中对指针所指向的内存进行操作。这种方式下,函数内部对指针的修改不会影响到原始的指针变量。但是,函数中对指针所指向的内存的修改会影响到原始内存。 地址传递是指将变量的地址作为参数传递给函数。这种方式下,函数内部对地址所对应的变量进行操作,会直接影响到原始变量的值。通过地址传递,可以实现在函数内部对原始变量进行修改。 下面是一个示例代码,展示了指针值传递地址传递区别: ```c #include <stdio.h> // 指针值传递 void pointerValuePass(int* ptr) { *ptr = 10; // 修改指针所指向的内存 ptr = NULL; // 修改指针本身不会影响原始指针 } // 地址传递 void addressPass(int* ptr) { *ptr = 20; // 修改地址对应的变量 ptr = NULL; // 修改指针本身不会影响原始指针 } int main() { int num = 0; int* ptr = &num; printf("Before pointerValuePass: num = %d\n", num); pointerValuePass(ptr); printf("After pointerValuePass: num = %d\n", num); printf("Before addressPass: num = %d\n", num); addressPass(&num); printf("After addressPass: num = %d\n", num); return 0; } ``` 输出结果为: ``` Before pointerValuePass: num = 0 After pointerValuePass: num = 10 Before addressPass: num = 10 After addressPass: num = 20 ``` 可以看到,指针值传递修改了指针所指向的内存,但没有修改原始指针的值;而地址传递直接修改了原始变量的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值