函数参数与指针
函数的形参是指针或者引用
那函数可以改变实参的值,就是实参指针指向的值,不能改变实参指针的地址;在函数内部改变实参地址,如给实参开辟一段新的内存,也是改变实参的地址,这些都不会生效。且容易造成内存泄露。例子:
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 = ℑ}//ERROR 指针容易变成野指针
protected:
cv::Mat* m_resutlImage;
};