C/C++指针理解

函数参数与指针

函数的形参是指针或者引用
那函数可以改变实参的值,就是实参指针指向的值,不能改变实参指针的地址;在函数内部改变实参地址,如给实参开辟一段新的内存,也是改变实参的地址,这些都不会生效。且容易造成内存泄露。例子:

void H_function(int *ptr)
{
	/*改变指针ptr的值*/
	//*ptr = 666;
	//cout<<"*ptr = "<<*ptr<<endl;
	
	/*改变指针ptr地址,ptr跟实参的地址已经不是一回事了,内存泄漏*/
	ptr = new int[666];
	*ptr = 666;
}

函数形参是指针的指针
如果要改变实参的指针,可以使用指针的指针。容易理解的情况是,传递一个空的指针到函数中,函数内部在具体给指针开辟内存,这就改变了指针的地址。

void H_function(int** ptr)
{
	if (*ptr == NULL)
	{
		*ptr = new int[666];
	}
	**ptr = 888;
}

用以下代码测试上面两个函数。

int main()
{
	int* ptr=NULL;
	cout << "ptr :" << ptr << endl;
	H_function(&ptr);
	cout << "ptr :" << ptr << "\tptr[0] :" << ptr[0] << endl;
	H_function(ptr);
	cout << "ptr :" << ptr << "\tptr[0] :" << ptr[0] << endl;

	return 0;
}

补充
以上是看<深入理解C/C++>总结的,如果没错,那么有以下补充:
在定义一个函数若只需要改变指针指向的值,应该用const修饰指针地址:int* const fpara

void H_function(int* const ptr)
{
	/*这里会编译错误,有效避免类似错误*/
	/*改变指针ptr地址,ptr跟实参的地址已经不是一回事了,内存泄漏*/
	ptr = new int[666];
	*ptr = 666;
}

指针与局部变量

如下所示,
函数setResultImage1将形参的值传递赋给m_resutlImage指向的值,这没什么问题。
函数setResultImage2企图将形参的地址赋给m_resutlImage,这就修改了m_resutlImage地址,m_resutlImage原本的地址指向的内存就没人管了,而且形参可能是局部变量在栈中,容易被系统释放,这时m_resutlImage也变成了无效指针。

class COperator
{
public:
	void setResultImage1(cv::Mat image){*m_resutlImage = image;}//OK
	void setResultImage2(cv::Mat image){m_resutlImage = &image;}//ERROR 指针容易变成野指针
protected:
	cv::Mat* m_resutlImage;
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值