指针与内存的分配

1.指针可以这样理解:

  int  *ptr; -----> 强调*ptr是一个int类型的指针。

  int*  ptr; ----->强调的是,int*是一种类型-----指向int的指针。

  注意:   int* p1,p2;    //该声明创建一个指针p1和一个int变量p2。

2.指针的危险

  • 计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。为数据提供空间是一个独立的步骤,很重要。
long* fellow;
*fellow = 123;/*fellow是一个指针,无指向,该代码没有将地址赋给fellow,导致fellow没有被初始化,其实就是一个野指针。*/

注意:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。

3.指针与内存

  • 指针可不是整型,虽然计算机通常把地址当作整数来处理,整数描述的是可加减乘除的数字,而指针描述的是位置。
  • c++使用new来分配内存(c语言中用的是三个loc)
  • 程序员要告诉new,需要为哪种数据类型分配内存,new将找到一个长度正确的内存块,并返回该内存块的地址。程序员的责任就是将该地址赋给一个指针。
(1) int * pn = new int;(2) int higgens;   int * pt = &higgens;(1)和(2)都是将一个int变量的地址赋给了指针。在(2)中可以通过名称higgens来访问该int,在(1)中只能通过该指针进行访问。pn指向的内存没有名称,pn指向一个数据对象,此对象不是oop中的对象,而是一样东西,数据对象比变量更通用,指的是数据项分配的内存块。
  • 使用delete释放内存(如果不将new分配的内存释放,发生内存泄漏)--------> delete pn; new并不意味着要使用用于new的指针,而是用于new的地址。
  • 一般来说,不要创建两个指向同一个内存块的指针,因为这将增加错误的删除同一个内存块两次的可能性。

4.适用new创建动态数组

  • int * psome = new int [10];
    new运算符返回第一个元素的地址。对于new创建的数组,释放则:
    delete [] psome;    //方括号告诉程序,释放整个数组,而不仅仅是指针指向的数组。
  • int * psome = new int [10];
    可以将它看做是一根指向该元素的手指。假设int占4个字节,则将手指沿正确的方向移动4个字节,手指将指向第2个元素。共10个元素,这就是手指移动的范围,因此,new语句提供了识别内存块中每个元素所需的全部信息。
  • 使用new与delete注意事项
    • 不要使用detlete来释放不是new分配的内存。
    • 不要使用delete释放同一个内存块。
    • 如果使用new[]为数组分配内存,则应使用delete[]来释放。
    • 如果使用new[]为一个实体分配内存 ,则应使用delete(无方括号)来释放。
    • 对空指针应用delete是安全的。
时间: 2024-09-26 22:58:32

指针与内存的分配的相关文章

终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ---------------------------------------------------------------------------------------------------------------- 在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一

指针以及内存分配

原文:http://blog.csdn.net/bizhu12/article/details/6532235 1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int  *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空"

指针 && 动态内存分配

C++中的动态内存分配机制 c++中使用new和delete来完成在堆上对动态内存的分配和释放. 注.所有指针都应该被初始化 如果指针指向的动态内存被释放或没有指向合法的地址,就应该将指针设置为nullptr,否则内存泄漏. 变量: double* pvalue {}; pvalue=new double; *pvalue=9.0; 或 double* pvalue {}; pvalue=new double {9.0}; 或合并为一句 double* pvalue {new double{9.

娓娓道来c指针 (2)内存分配

(2)内存分配 c语言中描述变量的时候常用的两个用语 1.作用域:也叫可见域,指的是变量的作用范围.在哪个范围内,该变量是可见的.可以使用的. 2.生存期:也叫存储期,指的是变量从创建到销毁的生存时间段. 作用域和存在域是两个不同的概念,比如在程序的某个位置,某变量存在(内存中分配了地址)但不可见(不可使用). 作用域 从作用域看,变量分为以下三种: 1.全局变量 在c语言中,把在任何函数之外声明的变量称为全局变量.一般情况下,全局变量在任何地方都是可见的.当然也有例外,比如在语句块{}内声明了

c++ 指针总结 函数参数指针调用和堆栈内存的分配原理

c++中的char指针 这个char指针很有意思,char指针通常有两种初始化形式.一个是使用char数组初始化,一个是使用char变量初始化. c++当中使用双引号括起来的字符串起始已经被编译器初始化为一个const char[]类型的字符串常量.也就是说"hedd"在赋值给其他变量或常量时实际上是将一个已经在内存中分配了地址的const char数组的头指针赋值给它.如果你使用's'这样的数字量是不能直接赋值给char指针的,因为's'是一个字符而不是拥有内存的字符变量或常量.这种

C指针与内存

C指针与内存 指针是C / C++ 中重要的构造类型,指针赋予了C / C++程序直接访问和修改内存的能力.C / C++的许多重要应用,如编译.OS.嵌入式开发都依赖于这种能力. 冯诺依曼体系的计算机内存存储指令和数据,我们可以将其抽象为指令区和数据区(当然实际情况要复杂得多).数据区中包含栈(stack)和堆(heap)区,栈区的数据由编译器管理而堆区数据则由程序员管理. 由于指令同样存在于内存中,那么函数在内存中也会拥有地址(指针). 函数指针相对于函数名来说 可以在运行期动态地选择调用的

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

内存的分配方式

一.内存的分配方式 程序占用的内存分为五个区域: 1.静态区/全局区(static)存放静态变量.全局变量,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间始终不变.2.栈区(stack)存放函数的参数值.局部变量的值等,由编译器自动分配释放.管理简单,空间使用效率高,但是生命周期很短暂,分配的内存容量有限.用来存储函数的参数和非静态局部变量.3.堆区(heap)也叫动态内存分配.程序在运行的时候new申请任意大小的内存,一般由程序员分配释放,如果程序员没有释放掉,程序会一直占用内

C 语言中的指针和内存泄漏

引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在 C 语言中拥有的最强大工具. 本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密.本文内容包括: 导致内存破坏的指针操作类型 在使用动态内存分配时必须考虑的检查点 导致内存泄漏的场景 如果您预先知道什么地方可能出错,那么您就能够小