关于参数“指针传递”,“指针引用传递”的区别
- C/C++ code
template <class T>void BinaryTree<T>::inOrder (BinTreeNode<T> *&subTree) //参数*&subTree{ if (subTree == NULL) return; else { inOrder (subTree->leftChild); cout<<subTree->data<<" "; inOrder (subTree->rightChild); }};void BinaryTree<T>::inOrder (BinTreeNode<T> *subTree) //参数*subTree{ if (subTree == NULL) return; else { inOrder (subTree->leftChild); cout<<subTree->data<<" "; inOrder (subTree->rightChild); }};使用两种的参数传递方式为什么不影响结果。第一种参数传递的意义是什么。
[解决办法]
单独指针只是传递的指针的值,指针形参的变化与调用的实参无关,只有用指针的引用才能将函数体内的初始化值传递回去上面的程序,说白了还是指针,只不过是二级指针,看以下例子:
- C/C++ code
void allocMem1(unsigned char** buf) { *buf = new unsigned char[100]; memset(*buf, 0, 100); } void allocMem2(unsigned char *&buf) { buf = new unsigned char[100]; memset(buf, 0xff, 100); } int _tmain(int argc, _TCHAR* argv[]) { unsigned char *p1, *p2; allocMem1(&p1); allocMem2(p2); }
[解决办法]
第一个指针引用,即参数subTree和函数的输入时同一个东西
第二个是普通的参数,这里参数subTree和函数的输入是指向同一个位置,但是却是两个不一样的指针。
void AllocMemory1(char *&p)
{
p = new char[100];
}
void AllocMemory2(char *p)
{
p = new char[100];
}
void main()
{
char *p1 = null;
char *p2 = null;
AllocMemory1(p1);//指行完后p1指向了新申请的内存
AllocMemory2(p2);//指行完后p2还是null,而且造成了内存泄露
}
好好理解一下这个例子