指针在函数中的应用

指针在函数中的应用:

1. 指针作为函数参数。

函数之间参数的传递要对数据进行拷贝,而利用指针作为函数参数传递数据的本质,就是在主调函数和被调函数中,通过指向同一内存地址的不同指针(函数传值时拷贝了一个指针)访问相同的内存区域,从而实现数据的传递和交换。如下:

# include <iostream>
using namespace std;
//指针在函数中的应用,这里是作为函数的参数 
void getSum(int* arr, int len, int* sum)	//arr指针:数组数据太大时,传指针更好; sum指针:便于修改并且传出值 
{
	*sum = 0;
	for(int i=0; i<len; ++i)
		*sum += *(arr+i);
	
	return;
}

int main()
{
	int arr[5] = {1, 2, 3, 4, 5};
	int sum;
	getSum(arr, 5, &sum);
	
	cout<<sum<<endl;
		
	return 0;
}

2. 指针作为函数的返回值(指针型函数)。

这里需要注意,不能把一个指向局部变量的指针作为返回值:因为函数内部声明的局部变量在函数结束后其生命周期已经结束,内存会被自动释放,这时它的内存地址无意义。如果将其作为函数返回值返回给主调函数,并在主调函数中访问这个指针所指向的数据,将产生不可预料的结果。如下:

# include <iostream>
using namespace std;

int* get()
{
	int a = 1;	
	return &a; //返回指向局部变量的指针 
}

int main()
{
	int* loc = get();
	cout<<"当前局部变量的值:"<<*loc<<endl;	
	
	int b = 2;	//声明一个新的整形变量,改变内存内容再次输出时,得到的是一个不确定的数值 
	cout<<"改变内存后,当前局部变量的值是:"<<*loc<<endl;
		
	return 0;
}
/*output:
当前局部变量的值:1
改变内存后,当前局部变量的值是:0     */ 

测试可见,第一次output 1时,虽然局部变量a已经不存在,但是存放它的内存中的值并没有改变,所以输出了1;而第二次,声明一个新的变量,改变这部分内存中的值时,输出的是一个不确定的值,这种错误具有很大的隐蔽性。故牢记下面的原则

指针函数可以返回全新申请的内存地址;可以返回全局变量的地址;可以返回静态变量的地址;但就是不可以返回局部变量的地址





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值