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

如果想要在子函数中为指针分配空间,那么参数应该是指针,还是指针的引用呢?

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、总结
在子函数中为指针分配空间,参数列表中要使用指针的引用。
否则,若直接将指针作为形参,动态分配的空间会成为内存泄漏,不能达到分配空间的效果。

猜你喜欢

转载自blog.csdn.net/BruthYU/article/details/52661564