指针在子函数中分配空间若干问题
2016-09-25 14:11
176 查看
如果想要在子函数中为指针分配空间,那么参数应该是指针,还是指针的引用呢?
0、知识储备:指针与cout
输出结果是:
0x28ff44
0x28ff40
1
0x28ff40
1、再看这样一段代码
输出结果是:
0x3a0ff0
0x7efde000
5
我们看到,虽然可以给a[1]赋值且可以输出它的值,但指针a和分配空间后的指针b指向的地址并不相同,所以我们并没有成功给a分配空间,能给a[1]赋值只是因为a[1]等价与*(a+1),而a+1这个位置的空间正好可以被使用罢了。
指针和普通变量一样,都是拷贝给了子函数的形参,形参可以通过与实参相同的指向改变指向的变量,但对指针本身的操作(比如为指针形参申请空间,改变指针形参指向的地址),都不会对指针实参造成影响。
![](https://img-blog.csdn.net/20160925140232574)
2、我们知道,函数内的变量在作用域内有效,作用域外无效,1中指针变量b在子函数执行结束后被释放,那么它申请的空间怎样了呢?
在子函数结束后,如果我们没能获得这片空间的首地址,那么我们就没有任何方法访问这片空间了,这片空间就会成为死区,即所谓“内存泄漏”。
但是,我们可以通过将这片空间的指针作为返回值传出子函数,或将指针在子函数中保存在一个引用参数中的方法,在子函数外部继续访问这片空间。可以带着这种理解看下面的代码:
输出结果:1
3、若参数列表中使用引用,在子函数中对引用的操作等同于对引用源的操作;
输出结果:
0x350ff0
0x350ff0
5、总结
在子函数中为指针分配空间,参数列表中要使用指针的引用。
否则,若直接将指针作为形参,动态分配的空间会成为内存泄漏,不能达到分配空间的效果。
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、总结
在子函数中为指针分配空间,参数列表中要使用指针的引用。
否则,若直接将指针作为形参,动态分配的空间会成为内存泄漏,不能达到分配空间的效果。
相关文章推荐
- 指针在子函数中动态分配空间的问题及解决方法
- 指针赋值与空间分配问题
- 指针,数组,连续开辟空间的地址分配和读取问题
- 44. 腾讯面试题: 使用函数的参数指针,分配内存空间问题
- 一级指针,二级指针在函数调用传址问题。在子函数中分配内存。
- 两个指针指向同一个由malloc分配的空间,free掉一个问题
- 关于c语言中自动变量(局部自动变量)的空间的分配的问题
- 指针与数组的区别,以及指针的空间开辟问题
- delphi中为动态数组分配空间的问题
- 指向指针的指针(**)做为参数时,内存分配问题探索
- c语言函数内为外部分配空间问题
- 对指针进行初始化中的若干问题的思考与反思
- 怪异问题 调试到位置(test dword ptr [eax],eax ; probe page.)局部数组变量定义所分配的最大空间为1M
- C/C++中空指针与0与NULL和其他若干问题小结。(转帖)
- C primer plus:在结构中使用指针,使用malloc分配指针空间以及free
- 常见指针分配问题
- 指针与数组的区别,以及指针的空间开辟问题
- delete 基类指针 释放为派生类分配的空间
- 指针分配的空间
- 令我困惑多时的二维指针分配问题总结