您的位置:首页 > 其它

指针在子函数中分配空间若干问题

2016-09-25 14:11 176 查看
如果想要在子函数中为指针分配空间,那么参数应该是指针,还是指针的引用呢?

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、总结

在子函数中为指针分配空间,参数列表中要使用指针的引用。

否则,若直接将指针作为形参,动态分配的空间会成为内存泄漏,不能达到分配空间的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: