指针以及内存分配(转载自:http://blog.csdn.net/bizhu12/article/details/6532235)
来源:互联网 发布:it业务范围 编辑:程序博客网 时间:2024/06/10 14:04
指针以及内存分配
1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里.
2. 给指针赋值,我能力有限,只知道有两种,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量);这两种方法通过以下代码实现:
- #include <stdio.h>
- #include <malloc.h>
- int main()
- {
- //第一种
- int *p1 = (int*)malloc(sizeof(int)); //动态的在堆上分配一块内存(手动分配)
- scanf("%d",p1);
- printf("%d/n",*p1);
- free(p1); //释放内存
- //第二种
- int i; //由系统自动在栈上分配一块内存
- int *p2 = NULL;
- scanf("%d",&i);
- p2 = &i; //将p2指向栈上i的内存
- printf("%d/n",*p2);
- return 0;
- }
3. 不知道你是否知道我为什么没有在第二种方法后也加free(p2)?如果加了free(p2)编译器会报内存错误,因为p2指向的是i内存,i的内存是在
栈上,栈上的内存都是由系统管理,如分配和释放,不需要手动管理,这里使用free(p2)是在释放i的内存,这块内存不需要你管,你却使用free()管理当然会报错,
4. 动态分配内存,在C语言中是使用malloc()分配和使用free()释放,在C++中,是使用new分配和delete释放,都是在堆上分配,malloc()括号内是内存的大小,是size_t(unsigned int)类型,free()括号内是内存的地址或是指向这块内存的指针,new是C++的重载函数,new+大小,
delete+地址;具体的用法看代码:
- #include <stdio.h>
- #include <malloc.h>
- #include <iostream>
- using namespace std;
- int main()
- {
- //第一种
- int *p1 = new int; //动态的在堆上分配一块内存(手动分配)
- scanf("%d",p1);
- printf("%d/n",*p1);
- delete p1; //释放内存
- //第二种用法
- int *p2 = new int[3]; //分配3块int类型大小的内存空间
- int i =0;
- while(i<3)
- {
- scanf("%d",&p2[i]);
- i++;
- }
- delete [] p2; //注意这个释放方式
- //第三中用法
- int *p3 = new int(45); //分配一块内存,并将45存放到这块内存中
- printf("%d/n",*p3);
- delete p3;
- return 0;
- }
第二种方式我依次输入的是56,78,23,下图是p2的存储方式
注:如果有错误的地方希望指出,谢谢!
- 指针以及内存分配(转载自:http://blog.csdn.net/bizhu12/article/details/6532235)
- C++的内存管理(转载自:http://blog.csdn.net/bizhu12/article/details/6668834)
- 转载自http://blog.csdn.net/fei20072050104/article/details/21785565
- 转载自:http://blog.csdn.net/lmj623565791/article/details/24015867
- 转载自 http://blog.csdn.net/racehorse/article/details/6593719
- 转载自http://blog.csdn.net/zhengzhihust/article/details/44151785
- 转载自http://blog.csdn.net/huxu981598436/article/details/51626569
- 转载自http://blog.csdn.net/lwyygydx/article/details/41870377
- 转载自:http://blog.csdn.net/go_hyp/article/details/53693058
- 转载自 http://blog.csdn.net/bieleyang/article/details/76973220
- 转载自http://blog.csdn.net/wwww1988600/article/details/7309070
- 浅析值类型与引用类型的内存分配[转载]http://blog.csdn.net/yuchen_0515/article/details/5330106
- 搜索引擎技术之概要预览(转载自http://blog.csdn.net/v_july_v/article/details/6827391)
- Java的XML创建、解析文档(转载自http://blog.csdn.net/psyuhen/article/details/7539228)
- Freemarker模板应用 <转载自http://blog.csdn.net/zgmzyr/article/details/7304220>
- JAXB注解---转载自 http://blog.csdn.net/lw371496536/article/details/6942045
- C++ 虚函数表解析 本文转载自:http://blog.csdn.net/haoel/article/details/1948051/
- dispatch_get_main_queue 转载自http://blog.csdn.net/nono_love_lilith/article/details/7829557 的空间
- MFC简单皮肤颜色绘制(SetDialogBkColor不再被支持,看 WM_CTLCOLOR消息如何百变控件颜色)
- 编译器对const char*的态度转变
- 收集struts2各种版本下载地址
- Android:用户定位User Localtion和利用HTTP解析地址--GeoCoding
- 程序员面试100题之三:不用+、-、×、÷数字运算符做加法
- 指针以及内存分配(转载自:http://blog.csdn.net/bizhu12/article/details/6532235)
- kfs代码研究(六、ChunkManager分析)
- C++的内存管理(转载自:http://blog.csdn.net/bizhu12/article/details/6668834)
- ubuntu 下进入root 命令
- 程序员面试100题之四:求1+2+...+n
- win7
- DVCon (Design and Verification Conference)
- 指针
- IMF android input method 输入法研究