指针以及内存分配
2015-06-11 22:39
232 查看
原文:http://blog.csdn.net/bizhu12/article/details/6532235
1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里.
2. 给指针赋值,我能力有限,只知道有两种,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量);这两种方法通过以下代码实现:
[cpp] view plaincopy
#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+地址;具体的用法看代码:
[c-sharp] view plaincopy
#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的存储方式
1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里.
2. 给指针赋值,我能力有限,只知道有两种,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量);这两种方法通过以下代码实现:
[cpp] view plaincopy
#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+地址;具体的用法看代码:
[c-sharp] view plaincopy
#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的存储方式
相关文章推荐
- 资源整理
- Java高级程序员技术积累
- DECLARE
- PHP数组和Json之间的互相转换 json_encode() 和 json_decode()
- 【ORM】关于Dapper的一些常见用法
- 20135322实验五实验报告
- Code::Blocks使用与调试一条龙
- 51单片机使用 mpu6050DMP
- 使用Github来管理xcode4中的代码片段
- 树状数组
- svn 版本库的创建和配置
- 考试考完了·
- sdk 手册书写指导
- mac下openfire 3.8.2 源码部署 /开发配置 / 二次开发
- java网络编程与安全
- Java基础-数组——String字符串
- 关注PHPthinking官网微信公众号——红包拿走
- 博弈论初探——取石子游戏
- My learn of git
- 线程创建的方法(继承与接口)