有如下代码:
void changePtr(int *p) {
*p = 4;
}
int main()
{
int* p = new int(5);
changePtr(p);
cout << " *p:" << *p << endl;
}
以上代码我们都知道传递指针,函数改变了指针指向地址内的数据,
函数体外部调用时p指向地址发生了改变,输出结果由5->4。
但是在实际开发中碰到一种情况,本身初始化指针为nullptr,由函数内部进行初始化操作,如下代码:
void changePtr(int *p) {
p = new int(4);
}
int main() {
int* p = nullptr;
changePtr(p);
cout << " *p:" << *p << endl;
return 0;
}
乍一看貌似什么问题,外部调用p时应该是已经初始化好的指针p,但是发现函数调用后p依然为nullptr。
问题原因:我们知道p传入时地址是一个nullptr值,想通过函数给p地址赋值,但是忽略了,此时函数调用了一次赋值操作,p在函数体内部的地址确实改变了,但是不会影响外部变化,所以导致外部调用时依旧为nullptr(注意此处注意区分地址和地址指向值得不同)这就像值传递和引用传递。
所以修改如下:
void changePtr(int **p) {
*p = new int(4);
}
int main() {
int* p = nullptr;
changePtr(&p);
cout << " *p:" << *p << endl;
return 0;
}
或者
void changePtr(int *&p) {
p = new int(4);
}
int main() {
int* p = nullptr;
changePtr(p);
cout << " *p:" << *p << endl;
return 0;
}
但是需要注意的地方这里我们函数体内初始化指针,这样存在内存泄漏问题,这是迫不得已的情况,实际开发需要注意,在哪里创建需要在哪释放掉。
标签:初始化,int,nullptr,C++,changePtr,地址,指针 From: https://blog.csdn.net/muyuchengfeng_/article/details/143949412