博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针以及内存分配
阅读量:2189 次
发布时间:2019-05-02

本文共 1445 字,大约阅读时间需要 4 分钟。

1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int  *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int  *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里.

 

2. 给指针赋值,我能力有限,只知道有两种,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量);这两种方法通过以下代码实现:

[cpp]
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. int main()  
  4. {  
  5.     //第一种  
  6.     int *p1 = (int*)malloc(sizeof(int)); //动态的在堆上分配一块内存(手动分配)  
  7.     scanf("%d",p1);  
  8.     printf("%d/n",*p1);  
  9.     free(p1);  //释放内存  
  10.   
  11.     //第二种  
  12.     int  i;           //由系统自动在栈上分配一块内存  
  13.     int  *p2 = NULL;    
  14.     scanf("%d",&i);  
  15.     p2 = &i;          //将p2指向栈上i的内存  
  16.     printf("%d/n",*p2);  
  17.   return 0;    
  18. }  

 

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]
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include <iostream>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     //第一种  
  8.     int *p1 = new int//动态的在堆上分配一块内存(手动分配)  
  9.     scanf("%d",p1);  
  10.     printf("%d/n",*p1);  
  11.     delete p1;  //释放内存  
  12.      
  13.     //第二种用法  
  14.     int  *p2 = new int[3]; //分配3块int类型大小的内存空间  
  15.     int  i =0;  
  16.     while(i<3)  
  17.     {  
  18.         scanf("%d",&p2[i]);   
  19.         i++;  
  20.     }  
  21.     delete [] p2; //注意这个释放方式  
  22.   
  23.     //第三中用法  
  24.     int *p3 = new int(45); //分配一块内存,并将45存放到这块内存中  
  25.     printf("%d/n",*p3);  
  26.     delete p3;  
  27.       
  28.   return 0;    
  29. }  

 

第二种方式我依次输入的是56,78,23,下图是p2的存储方式

 

 

注:如果有错误的地方希望指出,谢谢!

转载地址:http://jmkub.baihongyu.com/

你可能感兴趣的文章
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>