如果想要在子函数中为指针分配空间,那么参数应该是指针,还是指针的引用呢?
0、知识储备:指针与cout
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int main()
{
int b=1;
int *a=&b;
cout<<a<<endl;
cout<<&a<<endl;
cout<<*a<<endl;
cout<<&b<<endl;
return 0;
}
输出结果是:
0x28ff44
0x28ff40
1
0x28ff40
说明cout<<a<<endl;输出了指针a存放的地址(指向的地址),而非它本身的地址
1、再看这样一段代码
void fun (int *b)
{
b=new int[100];
cout<<b<<endl;//输出指针b指向的地址
}
int main()
{
int *a;
fun(a);
a[1]=5;
cout<<a<<endl;//输出指针a指向的地址
cout<<a[1]<<endl;
return 0;
}
输出结果是:
0x3a0ff0
0x7efde000
5
我们看到,虽然可以给a[1]赋值且可以输出它的值,但指针a和分配空间后的指针b指向的地址并不相同,所以我们并没有成功给a分配空间,能给a[1]赋值只是因为a[1]等价与*(a+1),而a+1这个位置的空间正好可以被使用罢了。
指针和普通变量一样,都是拷贝给了子函数的形参,形参可以通过与实参相同的指向改变指向的变量,但对指针本身的操作(比如为指针形参申请空间,改变指针形参指向的地址),都不会对指针实参造成影响。
2、我们知道,函数内的变量在作用域内有效,作用域外无效,1中指针变量b在子函数执行结束后被释放,那么它申请的空间怎样了呢?
在子函数结束后,如果我们没能获得这片空间的首地址,那么我们就没有任何方法访问这片空间了,这片空间就会成为死区,即所谓“内存泄漏”。
但是,我们可以通过将这片空间的指针作为返回值传出子函数,或将指针在子函数中保存在一个引用参数中的方法,在子函数外部继续访问这片空间。可以带着这种理解看下面的代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int* function()
{
int *a;
a=new int;
*a=1;
return a;
}
int main()
{
int *a;
a=function();
cout<<*a<<endl;
return 0;
}
输出结果:1
3、若参数列表中使用引用,在子函数中对引用的操作等同于对引用源的操作;
void fun(int *&b)
{
b=new int[100];
cout<<b<<endl;
}
int main()
{
int *a;
fun(a);
cout<<a<<endl;
return 0;
}
输出结果:
0x350ff0
0x350ff0
5、总结
在子函数中为指针分配空间,参数列表中要使用指针的引用。
否则,若直接将指针作为形参,动态分配的空间会成为内存泄漏,不能达到分配空间的效果。