指针、动态内存传递

1.指针:允许直接获取和操纵数据地址,实现动态存储分配。

int *pi;
*pi=5;

上述代码是错误的,整数指针pi并没有指向实际的地址,赋的值不知道该放到哪里去。
2. 下面哪个能够成功实现两个数的交换。

1)void swap1(int a, int b)
	{
		int temp;
		temp=a;
		a=b;
		b=temp;
	}
	
2)void swap2(int *a, int *b)
	{
		int *temp;
		*temp=*a;            //是拷贝而非指向
		*a=*b;
		*b=temp;
	}
	
	3)void swap3(int *a, int *b)
	{
		int *temp;
		temp=a;                    //是指向而非拷贝
		a=b;
		b=temp;
	}
4)void swap4(int *a, int *b)
	{
		int temp;
		temp=*a;
		*a=*b;
		*b=temp;
	}
5)void swap5(int &a, int &b)
	{
		int temp;
		temp=a;
		a=b;
		b=temp;
	}
	int main()
	{	
		int m=1,n=2;
		swap1(m,n);
		swap2(&m,&n);
		swap3(&m,&n);
		swap4(&m,&n);
		swap5(&m,&n);
	}

swap1传的是值的副本,在函数体内被修改了形参a和b,a和b的值确实交换了,但它们是局部变量,不会影响到主函数的m和n。当函数生命周期结束时,a和b所在的栈也就被删除。
swap2传的是一个地址进去,在函数体内的形参a和b,是指向实际参数m,n地址的两个指针。但
int *temp;
*temp=*a;
是不符合逻辑的一段代码,int *temp;新建了一个指针但没有分配内存,temp=a;是拷贝不是指向,也就是把a所指向的内存里的值(也就是实参m的值)拷贝到temp所指向的内存里了(int *temp的确是不进行内存分配,于是在系统拷贝是会临时给一个随机地址,分配的随机地址是个意外,且函数结束后不收回,造成内存的泄露 )。
swap3不能实现,因为函数体内只是指针的变化,而对地址中的值却没有改变。
swap4可以实现两数的交换。它修改的是指针所指向地址中的值。
swap5与swap4类似,是一个引用传递,修改的结果直接影响实参。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值