文档库 最新最全的文档下载
当前位置:文档库 › 动态指针数组申请和释放内存

动态指针数组申请和释放内存

动态指针数组申请和释放内存
动态指针数组申请和释放内存

c语言中内存的动态分配与释放(多维动态数组构建) (2012-02-29 00:17) 标签: c语言内存动态分类:C/C++

一. 静态数组与动态数组

静态数组比较常见,数组长度预先定义好,在整个程序中,一旦给定大小后就无法再改变长度,静态数组自己自动负责释放占用的内存。

动态数组长度可以随程序的需要而重新指定大小。动态数组由内存分配函数(malloc)从堆(heap)上分配存储空间,只有当程序执行了分配函数后,才为其分配内存,同时由程序员自己负责释放分配的内存(free)。

二. 为什么要使用动态数组?

在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。为了解决上述问题,c语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

三. 动态数组与静态数组的比较

对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!

对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

四. 如何构建动态数组?

构建动态数组时,我们遵循下面的原则:

申请的时候从外层往里层,逐层申请;

释放的时候从里层往外层,逐层释放;

五. 构建动态数组所需指针

对于构建一维动态数组,需要一维指针;

对于二维,则需要一维,二维指针;

对于三维,需要一,二,三维指针;

依此类推。

六. 动态内存分配与释放函数

1./*动态内存分配与释放函数*/

2.void *malloc(unsigned int size);

3.void *calloc(unsigned int num, unsigned int size);

4.void *realloc(void *p,unsigned int size);

5.void free(void *p);

说明:

(1)

malloc()函数成功:返回所开辟空间首地址;失败:返回空指针;功能:向系统申请size字节堆

的空间;

calloc()成功:返回所开辟空间首地址;失败:返回空指针;功能:按类型向系统申请num个size 字节堆的空间;

realloc()成功:返回所开辟空间首地址;失败:返回空指针;功能:将p指向的空间变为个size 字节堆的空间;

free()没有返回值,释放p指向的堆空间;

(2)

规定为void *类型,这并不是说该函数调用后无返回值,而是返回一个结点的地址,该地址的类型为void(无类型或类型不确定),即一段存储区的首址,其具体类型无法确定,只有使用时根据各个域值数据再确定。可以用强制转换的方法将其转换为别的类型。例如:

1.double *pd = NULL;

2.pd = (double *)calloc(10, sizeof(double));

表示将向系统申请10个连续的double类型的存储空间,并用指针pd指向这个连续的空间的首地址。并且用(double)对calloc()的返回类型进行转换,以便把double类型数据的地址赋值给指针pd。

(3)

使用sizeof的目的是用来计算一种类型的占有的字节数,以便适合不同的编译器。

(4)检查动态内存是否分配成功

由于动态分配不一定成功,为此要附加一段异常处理程序,不致程序运行停止,使用户不知所措。

通常采用这样的异常处理程序段:

1.if(p ==NULL)/*或者if(!p)*/

2.{

3.printf("动态申请内存失败!\n");

4.exit(1);//异常退出

5.}

(5)这四个函数头文件均包含在中。

(6)分配的堆空间是没有名字的,只能通过返回的指针找到它。

(7)绝不能对非动态分配存储块使用free。也不能对同一块内存区同时用free释放两次,如:

1.free(p);

2.free(p);

(8)调用 free()时, 传入指针指向的内存被释放, 但调用函数的指针值可能保持不变, 因为p 是作为形参而传递给了函数。严格的讲, 被释放的指针值是无效的, 因为它已不再指向所申请的内存区。这时对它的任何使用便可能会可带来问题。所以在释放一个指针指向的内存后,将该指针赋值为0,避免该指针成为野指针:

1.int*p =(int*)malloc(sizeof(int));

2.free(p);/*释放p指向内存*/

3.p = 0;/*或者 p =NULL,释放p指向的内存后,将p指针赋值为0,避免p指针成为野指针*/

(9)malloc与calloc的区别,对于用malloc分配的内存区间,如果原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题,因此在使用它之前必须先进行初始化(可用memset函数对其初始化为0),但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。当你在calloc()函数和malloc()函数之间作选择时,你需考虑是否要初始化所分配的内存空间,从而来选择相应的函数。

六.动态数组构建过程

以三维整型数组为例int array[x][y][z]

先遵循从外到里,逐层申请的原则:

最外层的指针就是数组名array,他是一个三维指针,指向的是array[],array[]是二维指针,所以给array申请内存空间需要一个三维指针int *** p;

1./*给三维数组array[x][y][z]动态分配内存*/

2.int*** p =(int***)malloc(x * sizeof(int**));

3./*或者如下*/

4.array = (int ***)malloc(x * sizeof(int **))

5./*指针p指向的是array三维数组的第一维,有x个元素,所以要sizeof(x *(int**))*/

次层指针是array[],它是一个二维指针,指向的是array[][],array[][]是一维指针:

1.int i, j;

2.for(i = 0; i < x; i++)

3.{

4.array[i]=(int**)malloc(y * sizeof(int*));

5.}

最内层指针是array[][],它是个一维指针,所指向的是array[][][],其是个整型常量。所以给array[][]申请内存应:

1.int i, j;

2.for(i = 0; i < x; i++)

3.{

4.for(j = 0; j < y; j++)

5.{

6.array[i][j]=(int*)malloc(z * sizeof(int));

7.}

8.}

综合以上三步:

1./*动态构建三维数组内存分配函数*/

2./*

3.* pArr:指向三维数组首地址

4.* x:三维数组第一维元素个数

5.* y:三维数组第二维元素个数

6.* z:三维数组第三维元素个数

7.*/

8.void Create3DActiveArray(int***pArr,int x,int y,int z)

9.{

10.int i, j, k;

11.pArr =(int***)malloc(x * sizeof(int**));

12.

13.for(i = 0; i < x; i++)

14.{

15.pArr[i]=(int**)malloc(y * sizeof(int*));

16.for(j = 0; j < y; j++)

17.{

18.pArr[i][j]=(int*)malloc(z * sizeof(int));

19.for(k = 0; k < z; k++)

20.{

21.pArr[i][j][k]= i + j + k;

22.}

23.}

24.}

25.}

内存释放函数:

1.void Free3DActiveArray(int***pArr,int x,int y)

2.{

3.int i, j, k;

4.for(i = 0; i < x; i++)

5.{

6.for(j = 0; j < y; j++)

7.{

8.free(pArr[i][j]);

9.pArr[i][j]= 0;

10.}

11.free(pArr[i]);

12.pArr[i]= 0;

13.}

14.free(pArr);

15.

16.}

1./*

2.2012年2月29日 12:00:32

3.目的:多维数组构建和释放,这里以构建一个动态3维数组为例

4.*/

5.

6.#include

7.#include

8.

9.void Malloc3DActiveArray(int*** pArr,int x,int y,int z);

10.void Free3DActiveArray(int*** pArr,int x,int y);

11.//void Display3DArray(int*** pArr,int x,int y,int z);

12.

13.

14.int main(void)

15.{

16.int x, y, z;

17.int***array=NULL;

18.

19.printf("输入一维长度: ");

20.scanf("%d",&x);

21.printf("输入二维长度: ");

22.scanf("%d",&y);

23.printf("输入三维长度: ");

24.scanf("%d",&z);

25.

26.Malloc3DActiveArray(array, x, y, z);

27.Free3DActiveArray(array, x, y);

28.array=NULL;

29.

30.return 0;

31.}

32.

33.void Malloc3DActiveArray(int*** pArr,int x,int y,int z)

34.{

35.int i, j, k;

36.pArr =(int***)malloc(x * sizeof(int**));

37.

38.for(i = 0; i < x; i++)

39.{

40.pArr[i]=(int**)malloc(y * sizeof(int*));

41.for(j = 0; j < y; j++)

42.{

43.pArr[i][j]=(int*)malloc(z * sizeof(int));

44.for(k = 0; k < z; k++)

45.{

46.pArr[i][j][k]= i + j + k + 1;

47.printf("%d ", pArr[i][j][k]);

48.}

49.printf("\n");

50.}

51.printf("\n");

52.}

53.}

54.

55.void Free3DActiveArray(int*** pArr,int x,int y)

56.{

57.int i, j;

58.for(i = 0; i < x; i++)

59.{

60.for(j = 0; j < y; j++)

61.{

62.free(pArr[i][j]);

63.pArr[i][j]= 0;

64.}

65.

66.free(pArr[i]);

67.pArr[i]= 0;

68.}

69.free(pArr);

70.}

1./*

2.2012年2月29日 12:32:02

3.功能:动态构建4维数组,学习动态构建多维数组,并释放多维数组

4.*/

5.

6.#include

7.#include

8.

9.int main()

10.{

11.int n1,n2,n3,n4;

12.int****array;

13.int i,j,k,m;

14.

15.puts("输入一维长度:");

16.scanf("%d",&n1);

17.puts("输入二维长度:");

18.scanf("%d",&n2);

19.puts("输入三维长度:");

20.scanf("%d",&n3);

21.puts("输入四维长度:");

22.scanf("%d",&n4);

23.

24.array=(int****)malloc(n1 * sizeof(int***));//第一维

25.

26.for(i = 0; i < n1; i++)

27.{

28.array[i]=(int***)malloc(n2 * sizeof(int**));//第二维

29.for(j = 0; j < n2; j++)

30.{

31.array[i][j]=(int**)malloc(n3 * sizeof(int*));//第三维

32.for(k = 0; k < n3; k++)

33.{

34.array[i][j][k]=(int*)malloc(n4 * sizeof(int));//第四维

35.for(m = 0; m < n4; m++)

36.{

37.array[i][j][k][m]= i + j + k + m + 1;

38.printf("%d\t",array[i][j][k][m]);

39.}

40.printf("\n");

41.}

42.printf("\n");

43.}

44.printf("\n");

45.}

46.

47.for(i = 0; i < n1; i++)

48.{

49.for(j = 0; j < n2; j++)

50.{

51.for(k = 0; k < n3; k++)

52.{

53.free(array[i][j][k]);//释放第四维指针

54.array[i][j][k]= 0;

55.}

56.

57.free(array[i][j]);//释放第三维指针

58.array[i][j]= 0;

59.}

60.

61.free(array[i]);//释放第二维指针

62.array[i]= 0;

63.}

64.

65.free(array);//释放第一维指针

66.array= NULL;

67.

68.return 0;

69.}

70.

71./*

72.在vc++6.0中输出结果为:

73.-----------------------------------

74.输入一维长度:

75.1

76.输入二维长度:

77.2

78.输入三维长度:

79.3

80.输入四维长度:

81.4

82.1 2 3 4

83.2 3 4 5

84.3 4 5 6

85.

86.2 3 4 5

87.3 4 5 6

88.4 5 6 7

89.Press any key to continue

数组名和指针的区别(小结)

在Win 32 中: 1. (1) 对数组名进行sizeof运算时,结果是整个数组占用空间的大小; (2) 但是数组作为函数参数时,对数组名进sizeof 运算,结果为4; (2) 对指针进行sizeof运算得到的值是编译器分配给指针(也就是一个地址)的内存空间,即为4。 2. (1) 对数组名作&运算,得到的还是数组第一个元素的地址; (2) 对指针取地址时得到的结果是指针所在的地址,也就是指向这个指针的指针,与指针的值不同。 BOOL mytest(char param[100]) { //参数数组名:paramBytes int paramBytes = sizeof(param); printf("paramBytes \t%d\n",paramBytes); //数组:mych1[] char mych1[] = "abcdefg123"; //若定义为mych1[100] int mych1Bytes = sizeof(mych1); printf("mych1Bytes \t%d\n",mych1Bytes);//输出:100 //数组:mych[200] char mych[200] = {0}; int myBytes = sizeof(mych); printf("myBytes \t%d\n",myBytes); printf("---addr \t%d\n",mych); printf("---addr \t%d\n",&mych); //指针:pch char* pch = "12345abc"; int pchBytes = sizeof(pch); printf("pchBytes \t%d\n",pchBytes); //pch = mych; printf("---addr \t%d\n",pch); printf("---addr \t%d\n",&pch); return TRUE; } 运行:

操作系统内存动态分配模拟算法

实验四存分配算法 1.实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助学生理解在动态分区管理方式下应怎样实现主存空间的分配和回收。 背景知识: 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离、主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。 2.实验容 采用首次适应算法或循环首次算法或最佳适应算法分配主存空间。 由于本实验是模拟主存的分配,所以当把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。(即输出当时的空闲区说明表及其存分配表) 利用VC++6.0实现上述程序设计和调试操作。 3.实验代码 #include #include using namespace std; //定义存的大小 const int SIZE=64; //作业结构体,保存作业信息 struct Project{ int number; int length; }; //存块结构体,保存存块信息 struct Block{

2016安全生产知识竞赛试题库(风险题)

2016安全生产知识竞赛试题库(风险题) 2016安全生产知识竞赛试题库(风险题) 三、风险题部分 (一)10分题目: 1.企业采购危险化学品时,应索取危险化学品什么和什么? 答:安全技术说明书和安全标签。 2.化工生产过程中的泄漏主要包括哪两种形式? 答:包括易挥发物料的逸散性泄漏和各种物料的源设备泄漏两种形式。 3.企业应对风险评价出的隐患项目,下达隐患治理通知,限期治理,应做到哪“四定”?答:做到定治理措施、定负责人、定资金来源、定治理期限。 4.企业从业人员转岗、脱离岗位一年以上(含一年)者,应进行哪两级安全培训教育,经考核合格后,方可上岗。 答:应进行车间(工段)、班组级安全培训教育,经考核合格后,方可上岗。 5.我国对危险化学品的安全管理,突出哪“两重点一重大”? 答:主要是:1)重点危险化工工艺2)重点监管危险化学品3)重大危险源 6.灼烫的部位主要包括哪几种? 答:主要包括:1)体表灼烫2)呼吸道灼烫3)消化道灼烫4)眼灼烫 7.请你说出在化工生产过程中,工艺参数主要指哪些? 答:1)温度2)压力3)流量4)料比等 8.涉及毒性气体、液化气体、剧毒液体的一级或者二级重大危险源,应配备独立的什么系统? 答:安全仪表系统 9.《爆炸危险场所安全规定》中将爆炸危险场所划分为哪三个等级? 答:特别危险场所、高度危险场所和一般危险场所三个等级。 10.按照设计压力(p)的大小,压力容器可分为哪四类? 答:低压、中压、高压和A超高压四类 11.压力容器最常用的安全附件主要有那些? 答:主要有安全阀、爆破片、压力表和液位计等 12.依据新《安全生产法》规定。哪些单位应当设置安全生产管理机构或者配备专职安全生产管理人员。 答:矿山、金属冶炼、建筑施工、道路运输单位和危险物品的生产、经营、储存单位。 13.甲、乙、丙类液体仓库应设置什么设施?遇湿会发生燃烧爆炸的物品仓库应设置什么措施? 答:应设置防止液体流散的设施、防止水浸渍的措施。 14.化学危险品贮存方式分为哪三种: 答:a.隔离贮存;b.隔开贮存;c.分离贮存。 15.生产经营单位应当制定本单位的应急预案演练计划,根据本单位的事故预防重点,每年每年至少组织一次什么演练,每半年至少组织一次什么演练。 答:每年至少组织一次综合应急预案演练或者专项应急预案演练,每半年至少组织一次现场处置方案演练。

实验三 数组与指针实验

实验三数组与指针实验 【实验目的】 1.学习使用数组数据对象。 2.掌握指针的使用方法。 3.学习通过动态内存分配实现动态数组的定义和使用,并体会指针在其中的作用。4.练习通过Debug观察指针的内容及其所指对象的内容。 【实验内容】 1.运行下列程序,观察运行结果。 (1)#include class ArrayElem { int x; public: ArrayElem(int i){x=i;} //带参数的构造函数 int getx(){return x;} }; int main() { ArrayElem obs[4] ={-1,-2,-3,-4}; //创建对象数组并初始化 for(int i=0;i<4;i++) cout<<"obs["< class NumClass { int num; public: void set_num(int val){num=val;} void show_num(){cout<<"The num is :"<set_num(20);p->show_num(); //通过指针调用成员函数 return(0); } (3)#include class NumClass

动态内存分配

浅析动态内存分配及Malloc/free的实现2011-03-18 22:47一、概述: 动态内存分配,特别是开发者经常接触的Malloc/Free接口的实现,对许多开发者来说,是一个永远的话题,而且有时候也是一个比较迷惑的问题,本文根据自己的理解,尝试简单的探究一下在嵌入式系统中,两类典型系统中动态内存分配以及Malloc/Free的实现机制。 二、内存分配方式 Malloc/Free主要实现的是动态内存分配,要理解它们的工作机制,就必须先了解操作系统内存分配的基本原理。 在操作系统中,内存分配主要以下面三种方式存在: (1)静态存储区域分配。内存在程序编译的时候或者在操作系统初始化的时候就已经分配好,这块内存在程序的整个运行期间都存在,而且其大小不会改变,也不会被重新分配。例如全局变量,static变量等。 (2)栈上的内存分配。栈是系统数据结构,对于进程/线程是唯一的,它的分配与释放由操作系统来维护,不需要开发者来 [url=javascript:;]管理[/url] 。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,不同的操作系统对栈都有一定的限制。 (3)堆上的内存分配,亦称动态内存分配。程序在运行的期间用malloc申请的内存,这部分内存由程序员自己负责管理,其生存期由开发者决定:在何时分配,分配多少,并在何时用free来释放该内存。这是唯一可以由开发者参与管理的内存。使用的好坏直接决定系统的性能和稳定。 三、动态内存分配概述 首先,对于支持虚拟内存的操作系统,动态内存分配(包括内核加载,用户进程加载,动态库加载等等)都是建立在操作系统的虚拟内存分配之上的,虚拟内存分配主要包括: 1、进程使用的内存地址是虚拟的(每个进程感觉自己拥有所有的内存资源),需要经过页表的映射才能最终指向系统实际的物理地址。 2、主内存和磁盘采用页交换的方式加载进程和相关数据,而且数据何时加载到主内存,何时缓存到磁盘是OS调度的,对应用程序是透明的。 3、虚拟存储器给用户程序提供了一个基于页面的内存大小,在32位系统中,用户可以页面大小为单位,分配到最大可以到4G(内核要使用1G或2G等内存地址)字节的虚拟内存。 4、对于虚拟内存的分配,操作系统一般先分配出应用要求大小的虚拟内存,只有当应用实际使用时,才会调用相应的操作系统接口,为此应用程序分配大小以页面为单位的实际物理内存。 5、不是所有计算机系统都有虚拟内存机制,一般在有MMU硬件支持的系统中才有虚拟内存的实现。许多嵌入式操作系统中是没有虚拟内存机制的,程序的动态分配实际是直接针对物理内存进行操作的。许多典型的实时嵌入式系统如Vxworks、Uc/OS 等就是这样。 四、动态内存分配的实现 由于频繁的进行动态内存分配会造成内存碎片的产生,影响系统性能,所以在不同的系统中,对于动态内存管理,开发了许多不同的算法(具体的算法实现不想在这里做详细的介绍,有兴趣的读者可以参考Glib C 的源代码和附录中的资料)。不同的操作系统有不同的实现方式,为了程序的可移植性,一般在开发语言的库中都提供了统一接口。对于C语言,在标准C库和Glib 中,都实现了以malloc/free为接口的动态内存分配功能。也就是说,malloc/free库函索包装了不同操作系统对动态内存管理的不同实现,为开发者提供了一个统一的开发环境。对于我们前面提到的一些嵌入式操作系统,因为实时系统的特殊要求(实

变量的指针和指针变量的区别是什么

2变量的指针和指针变量的区别是什么。 答;一个变量的地址指出了变量的存储单元在内存中的具体位置,能对变量进行存取操作。这个变量的地址就是变量的指针。指针是一种具有特殊意义的整型数,指针不能存放在一般的整型变量中,必须存放在专门指针的变量中,这类变量就是指针变量。 3 一维数组元素的引用有哪些方式。 答;下标法、地址法、指针法 4 2维数组列地址有哪些计算方法。 答;1 根据数组元素所在的行计算出行地址,然后把行地址转换成行中首元素的地址,再根据数组元素所在的列计算数组元素的地址。 2 根据2维数组的数组元素在存储空间上按行连续存放的特点,每个数组元素的地址等于2维数组元素的首元素地址加上该数组元素相对于首元素位置的偏移量。 3把2维数组的每一行当作一个一维数组,用一维数组元素地址的计算方法计算相应的2维数组元素的地址。 第9章结构体与共用体 1 什么是链表。其中单向链表具有哪些特点。 答;链表是若干个同样类型的结构通过依次串接方式构成的一种动态数据结构。链表中的每一个结构体数据成为结点,链表可以分成单向链表和双向链表 单向链表的特点;1 链表中的结点数据可以改变的 2 结点占用的内存是动态分配内存和动态释放内存函数。 2 对单向链表的常用操作有哪些。 答;对单向链表的常用操作有建立、显示、插入,删除和查找。 3 什么是共用体。 答;共用体是一个集合体。它的各个成员的数据类型可以是不相同的,所有成员共享同一段存储空间,存储空间的大小取决存储单元最大的成员的数据类型。 4 指向结构体类型变量的指针变量引用形式有哪些。 答;有两种形式;【星号指针变量名】。成员名和指针变量名-大于号成员名。 第10章位运算及编译预处理 1 C提供的编译预处理功能有哪些。如何实现。 答;功能有三种;宏定义、文件包含和条件编译,分别用宏定义命令、文件包含命令、条件编译命令实现。 2 文件包含的基本功能是什么。 答;文件包含处理是一个源文件可以将另一个源文件的全部内容包含到本文件中来,作为本文件的一部分,这可以节省程序设计人员的重复劳动。 【3【在C语言中提供了几种什么样的位运算符。 答;-、小于小于、大于大于、 4 文件包含需要注意哪些问题 答;一个井include命令只能指定一个被包含文件,包含多个文件侧需多个井include命令;文件包含可以嵌套,即一个被包含文件中可以包含另一个被包含的文件;在井include命令中,文件名可以用双引号或尖括号括起来。 第11章文件 1 文件的结束标志有哪些。 答;每个文件都有一个结束标志。当文件的位置指针移到文件的结束标志处时,表示文件结束。如何测试文件是否结束,常有2种方法 1 ASCII码文件的结束标志用【-1】表示。

动态内存管理知识总结

1.标准链接库提供四个函数实现动态内存管理: (1)分配新的内存区域: void * malloc(size_t size); void *calloc(size_t count , size_t size); (2)调整以前分配的内存区域: void *realloc(void *ptr , size_t size); (3)释放以前分配的内存区域: void free(void *ptr); 2.void * malloc(size_t size); 该函数分配连续的内存空间,空间大小不小于size 个字节。但分配的空间中的内容是未知的。该函数空间分配失败则返回NULL。 3.void *calloc(size_t count , size_t size); 该函数也可以分配连续的内存空间,分配不少于count*size个字节的内存空间。即可以为一个数组分配空间,该数组有count个元素,每个元素占size个字节。而且该函数会将分配来的内存空间中的内容全部初始化为0 。该函数空间分配失败则返回NULL。 4. 以上两个分配内存空间的函数都返回void * (空类型指针或无类型指针)返回的指针值是“分配的内存区域中”第一个字节的地址。当存取分配的内存位置时,你所使用的指针类型决定如何翻译该位置的数据。以上两种分配内存空间的方法相比较,calloc()函数的效果更好。原因是它将分配得来的内存空间按位全部置0 。 5. 若使用上述两种分配内存的函数分配一个空间大小为0 的内存,函数会返回一个空指针或返回一个没有定义的不寻常指针。因此绝不可以使用“指向0 字节区域”的指针。 6. void *realloc(void *ptr , size_t size); 该函数释放ptr所指向的内存区域,并分配一个大小为size字节的内存区域,并返回该区域的地址。新的内存区域可以和旧的内存区域一样,开始于相同的地址。且此函数也会保留原始内存内容。如果新的内存区域没有从原始区域的地址开始,那么此函数会将原始的内容复制到新的内存区域。如果新的内存区域比较大,那么多出来部分的值是没有意义的。 7. 可以把空指针传给realloc()函数,这样的话此函数类似于malloc()函数,并得到一块内存空间。如果内存空间不足以满足内存区域分配的请求,那么realloc()函数返回一个空指针,这种情况下,不会释放原始的内存区域,也不会改变它的内容。 8. void free(void *ptr); 该函数释放动态分配的内存区域,开始地址是ptr,ptr的值可以是空指针。若在调用此函数时传入空指针,则此函数不起任何作用。 9. 传入free() 和realloc()函数的指针(若不为空指针时)必须是“尚未被释放的动态分配内存区域的起始地址”。否则函数的行为未定义。Realloc()函数也可以释放内存空间,例如:Char *Ptr = (char *)malloc(20); 如只需要10个字节的内存空间,且保留前十个字节的内容,则可以使用realloc()函数。 Ptr = Realloc(ptr,10); // 后十个字节的内存空间便被释放

学习有限空间检测仪制度及操作方式

有限空间检测制度 西安热力工程有限公司 2018年7月

一、成立有限空间作业专职领导小组 (一)工程公司成立领导小组: 组长:臧轲、王晋鹏 副组长:常林涛、巴溢、宋悦琪 成员:各施工工地现场施工员、技术员、安全员,以及各施工方现场负责人。 领导小组办公室设在安全技术部,办公室主任由龚大刚担任,主要负责此活动的组织协调、监督检查、上传下达等工作。 (二)专职领导小组职责 1、组长负责有限空间作业的统筹安排,人员调度及检查落实。 2、副组长负责组织有限空间检测仪的相关学习活动,现场检查。 3、施工方负责人负责办理有限空间操作申请书,并按章操作。 4、施工现场安全员负责检查落实,查处隐患。 二、有限空间作业安全管理制度 一、总则 第一条为了加强对公司各单位有限空间作业的安全管理与 监督,预防和减少生产安全事故,保障作业人员的安全与健康,根据《中华人民共和国安全生产法》、《工贸企业有限空间作业安全管理与监督暂行规定》等法律、法规,特制定本制度。 第二条本制度所称有限空间:是指封闭或者部分封闭,与外界相对隔离,出入口较为狭窄,作业人员不能长时间在内工作,

自然通风不良,易造成有毒有害、易燃易爆物质积聚或者氧含量不足的空间。 有限空间作业:是指作业人员进入存在危险有害因素(如缺氧、有硫化氢、一氧化碳、甲烷等有毒气体或粉尘中毒危险)且受到限制和约束的封闭、半封闭设备、设施及场所(如生产区域内的各类塔、球、釜、槽、罐、炉膛、锅炉、管道、容器、封闭料仓以及地下室、地窖、井、坑(池)、下水道、地下电缆沟等)的作业活动。 二、有限空间作业的安全保障 第三条建立健全有限空间作业安全生产制度及规程 (一)有限空间作业安全责任制度 各施工单位负责人是本单位有限空间作业的责任主体,对本单位有限空间作业安全负全面责任;我公司专职安全管理人员对本单位有限空间作业现场安全负责;我公司安技部负责对各施工有限空间作业进行监督检查。 (二)有限空间作业审批制度 进入有限空间作业的单位必须填写《有限空间作业审批表》,作业单位负责领取《有限空间作业审批表》,并填写基本内容,有关人员签字确认。有限空间所在单位填写隔绝安全措施等内容后,签字确认。《有限空间作业审批表》办理完毕后,安技部要对作业内容及安全措施进行审批。 (三)有限空间作业现场安全管理制度

《动态分配内存与数据结构》课后习题

《动态分配内存与数据结构》习题 学号姓名 一、选择题 1、是一种限制存取位置的线性表,元素的存取必须服从先进先出的规则。 A.顺序表B.链表C.栈D.队列 2、是一种限制存取位置的线性表,元素的存取必须服从先进后出的规则。 A.顺序表B.链表C.栈D.队列 3、与顺序表相比,链表不具有的特点是。 A.能够分散存储数据,无需连续内存空间 B.插入和删除无需移动数据 C.能够根据下标随机访问 D.只要内存足够,没有最大长度的限制 4、如果通过new运算符动态分配失败,返回结果是。 A.-1 B.0 C.1D.不确定 5、实现深复制中,不是必须自定义的。 A.构造函数B.复制构造函数 C.析构函数D.复制赋值操作符函数 6、分析下列代码是否存在问题,选择合适的选项:。 int main(void) { int *p = new int [10]; p = new int [10]; delete [] p; p = NULL; return 0; } A.没有问题 B.有内存泄漏 C.存在空悬指针 D.存在重复释放同一空间 7、通过new运算符动态分配的对象,存储于内存中的。 A.全局变量与静态变量区 B.代码区 C.栈区 D.堆区 8、下列函数中,可以是虚函数。 A.构造函数 B.析构函数 C.静态成员函数 D.友元函数 9、关于通过new运算符动态创建的对象数组,下列判断中是错误的。 A. 动态创建的对象数组只能调用默认构造函数 B. 动态创建的对象数组必须调用delete []动态撤销 C. 动态创建的对象数组的大小必须是常数或常变量 D. 动态创建的对象数组没有数组名 10、顺序表不具有的特点是 A. 元素的存储地址连续 B. 存储空间根据需要动态开辟,不会溢出 C. 可以直接随机访问元素 D. 插入和删除元素的时间开销与位置有关 11、假设一个对象Ob1的数据成员是指向动态对象的指针,如果采用浅复制的方式复制该对象得到对象Ob2,那么在析构对象Ob1和对象Ob2时会的问题。 A. 有重复释放 B. 没有 C. 内存泄漏 D. 动态分配失败 12、假设对5个元素A、B、C、D、E进行压栈或出栈的操作,压栈的先后顺序是ABCDE,则出栈的先后顺序不可能是。 A. ABCDE B. EDCBA C. EDBCA D. BCADE 13、假设对4个元素A、B、C、D、E进行压栈或出栈的操作,压栈的先后顺序是ABCD,则出栈的先后顺序不可能是。 A. ABCD B. DCBA C. BCAD D. DCAB 14、通过new运算符动态创建的对象的存放在中。 A. 代码区 B. 栈区 C. 自由存储区 D. 全局数据区 15、链表不具有的特点是。 A. 元素的存储地址可以不连续 B. 存储空间根据需要动态开辟,不会溢出 C. 可以直接随机访问元素 D. 插入和删除元素的时间开销与位置无关 16、有关内存分配和释放的说法,下面当中错误的是 A.new运算符的结果只能赋值给指针变量 B.动态创建的对象数组必须调用delete []动态撤销 C.用new分配的空间位置是在内存的栈区 D.动态创建的对象数组没有数组名 17、关于栈,下列哪项不是基本操作 A.删除栈顶元素 B.删除栈底元素 C.判断栈是否为空 D.把栈置空 18、关于链表,说法错误的是

特种设备检验开工前安全教育培训考核试题(答案)

锅检站开工前安全教育培训考核试题 (试卷满分100分,90分为合格)单位名称:姓名:成绩: 一、单项选择题(每小题1分,共20分) 1、安全带的正确挂扣方法应该是。 (C) A、同一水平 B、低挂高用 C、高挂低用 2、可燃性气体、蒸汽或粉尘与空气组成的混合物,与火源即能发生爆炸的最低浓度,称为该物的。 (B) A、爆炸极限 B、爆炸下限 C、爆炸上限 3、使用二氧化碳灭火器时,人应站在? (A) A、上风位 B、下风位 C、无一定位置 4、下列哪种灭火器不适用于扑灭电器火灾? (C) A、二氧化碳灭火器 B、干粉剂灭火剂 C、泡沫灭火器 5、如果因电器引起火灾,在许可的情况下,你必须首先。 (B) A、找寻适合的灭火器扑救 B、首先将有开关的电源关掉,切断电源 C、大声呼叫 6、干粉灭火器的使用方法是。 (B) A、拔下铅封,站在上风处对准火源上部由近到远吹扫 B、拔下铅封,站在上风处,对准火源根部有远到近来回吹扫 7、一级动火作业由( )批准后实施。(C) (A)厂主管领导 (B)厂安全科 (C)油田公司主管领导 8、一、二级动火作业票首次批准有效期是。(A) (A) 不超过8小时 (B) 不超过两个工作日(C)24小时 (D)最长5个工作日 9、一级动火作业票每次延时不得超过()小时,延期最多()次,二级动火作业票每次延时不超过()小时,延期最多()次。(A)(F)(A)(F) A、8小时 B、12小时 C、24小时 D、48小时 E、一次 F、两次 G、三次 10、动火前(包括动火停歇期超过()分钟再次动火),动火人应主动向动火点所在单位当监护人员呈验《动火安全作业证》,经其签字后方可进行动火作业。(A) A、30 B、20 C、60 D、120 11、动火前应该做的准备工作是。(A) A.清理现场、配备足量的灭火器材、专人看火、可燃气体分析 B.配备足量的灭火器材、专人看火 C.清理现场、可燃气体分析 12、下列哪种行为不符合进入油气区的安全要求?(B)

指针与数组 函数的组合

指针和数组 ? ? 1.指针数组:是其数组元素为指针的数组。记住:是一个存放着指针的数组,而不是一个指针 ?定义格式为:数据类型* 数组名[数组长度] ?如:int * a[10] ; [ ]的优先级高于*,意味着使得a是一个指针数组,表示具有10个元素的数组,每个元素是一个指向int 型的指针。 ? ?2,指向数组的指针:是一个指针,指向的是一个数组。 ?定义格式为:数据类型(*数组名) [数组长度] ?如:int (*a) [10];*先于a 结合,意味着a 是一个指针,指向具有10个int 值的数组, ? ? ?指针与函数 ? ?1, 函数的指针:首先它是一个指针,指向函数的入口地址;在C语言中,函数名就是来标识函数的入口地址。 ?与指向数组的指针不同,在数组中,可以对数组中的元素访问,可以进行算术运算。 而在函数中,只需考虑函数的入口地址,而不考虑函数中某具体指令或数据所在存 储单元的地址,即不能进行算术运算 ?定义格式:存储类型数据类型(*函数名) ( ) ?如:static int (*p) (); ?存储类型表示函数在文件中的存储方式 ?数据类型表示被指函数的返回值的类型 ?最后的空括号表示指针变量所指的是一个函数 ? ?如何用指向函数的指针变量的方式来调用相应的函数: ?1), 使用前,必须先定义并赋值 ?2), 指向函数的指针定义形式中的数据类型必须和赋给它的函数返回值类型相同 ?3), 指向函数的指针只能指向函数的入口,而不能使用*(p+1) 来表示函数的下一命令?4), 在函数指针赋值时,只需给出函数名而不需给参数,如p = max; ?5), 调用时,只需将(*p) 代替函数名即可,在p 后面的括号中根据需要写上实参,如: c = (*p) (a,b) ; ?如下程序:求直角三角形的斜边 ?#include ? #include ?main() ?{ ? int a ,b ,c , f() , (*f1)(); ? a = 3; b = 4;

指针与内存详解.

在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。 堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top对数据项进行插入和删除。 要点: 堆:顺序随意 栈:后进先出(Last-In/First-Out [编辑本段]堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。 4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。 5、程序代码区—存放函数体的二进制代码。 二、例子程序 这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( {

int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0;全局(静态)初始化区 p1 = (char *malloc(10; p2 = (char *malloc(20; } 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"; 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 [编辑本段]堆和栈的理论知识 1.申请方式 stack: 由系统自动分配。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 heap: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 = (char *malloc(10; 在C++中用new运算符 如p2 = new char[20];//(char *malloc(10; 但是注意p1、p2本身是在栈中的。 2.申请后系统的响应

DELPHI和C指针与内存分配比较

delphi和c指针与内存分配比较 1.动态变量 对于动态分内存的变量,使用System单元的下面两个函数: procedure New(var P:Pointer);//为变更分配内存 procedure Dispose(var P:Pointer);//释放内存 其中P为变量地址 示例: type Str18=string[18]; var P:^Str18; begin New(P); P^:='Now you see it...'; Dispose(P);{Now you don't...} end; ///////////////////////////// Delphi里自己管理内存的两对函数new(),dispose()和getmem(),freemem() delphi的指针 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C 语言的指针。 以下内容分为八部分,分别是 一、类型指针的定义 二、无类型指针的定义 三、指针的解除引用 四、取地址(指针赋值) 五、指针运算 六、动态内存分配 七、字符数组的运算 八、函数指针 一、类型指针的定义。对于指向特定类型的指针,在C中是这样定义的: int*ptr; char*ptr; 与之等价的Object Pascal是如何定义的呢? var ptr:^Integer; ptr:^char; 其实也就是符号的差别而已。 二、无类型指针的定义。C中有void*类型,也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型:Pointer。于是, ptr:Pointer; 就与C中的 void*ptr; 等价了。 三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),C的语法是(*ptr),ObjectPascal则是ptr^。 四、取地址(指针赋值)。取某对象的地址并将其赋值给指针变量,C的语法是 ptr=&Object; Object Pascal则是 ptr:=@Object; 也只是符号的差别而已。

c语言中动态内存申请与释放的简单理解

c语言中动态内存申请与释放的简单理解 在C里,内存管理是通过专门的函数来实现的。与c++不同,在c++中是通过new、delete函数动态申请、释放内存的。 1、分配内存 malloc 函数 需要包含头文件: #include 或 #include 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。 从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如: int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int); 或: int* parr; parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为sizeof(int) * 100; 而 malloc 则必须由我们计算需要的字节数,并且在返回后强行转换为实际类型的指针。 int* p; p = (int *) malloc (sizeof(int)); 第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。 第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:

C++指针与动态分配内存new关键字专题

本文作者:黄邦勇帅 本文是学习C++的基础内容,指针是C或C++所特有的,因此应熟练掌握指针的使用,本文集中介绍C或C++中的各种指针,包括指针数组,数组指针,常量(const)指针,指向指针的指针,尤其是对二维数组和指针进行了详细精辟的解释,在读完本文的二维数组和指针的讲解之后,相信你就会对指针有一个车底的了解了。 本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。 声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。 主要参考文献: 1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社2005年5月 2、C++.Primer.Plus.第四版.中文版Stanley B.Lippman、Barbara E.Moo著李师贤等译人民邮电出版社2006年3月 3、C++.Primer.Plus.第三版.中文版Stanley B.Lippman等著潘爱民张丽译中国电力出版社2002年5月 4、C++入门经典第三版[美]Ivor Horton著李予敏译清华大学出版社2006年1月 5、C++参考大全第四版[美]Herbert Schidt著周志荣朱德芳于秀山等译电子工业出版社2003年9月 6、21天学通第四版C++ [美]Jesse Liberty著康博创作室译人民邮电出版社2002年3月 第一部分:指针 11.1 基础 1.指针是一个变量,它存储着另一个变量或函数的地址,也就是说可以通过指针间接地引用变量。指针变量包含一个地址,而且可以存储任何数据类型的内存地址,但指针变量却被声明为特定的数据类型,一个指向整型数据类型的指针不能存储一个浮点型的变量地址。 2.指针声明的形式为,数据类型*指针变量名;其中*星号是指针运算符,例如int *x;声明x为int型指针.11.2 指针运算符*和&地址运算符 1.&地址运算符是一元运算符,能反回它的操作数的内存地址.如y=&x;把变量x的地址输入到y中,它与x的值无关,比如x的值为1000,而x的地址为55则,y将接收到地址55. 2.*指针运算符是一元运算符,它是&运算符的相反形式,*运算符能反回位于其操作数所指定的地址的变量的值.例如y = &x;z = *y;假设x的值为1000,地址为55,则第二条语句说明z的值为1000,*y把由y所指向的内存的地址的变量x的值赋给z。*运算符可理解为“在地址中”,则z=*y可描术为“z接收了在址址y中的值。”,3.其实可以把*y当成一个变量来使用,即可以为*y赋值等,例如*y=100;(*y)++;等,但要注意的是对*y的操作相当于是对此指针指向的地址中的变量的操作,即对*y=100的赋值语句,相当于是x=100,而(*y)++则相当于x++。11.3 指针的运算 0.指针只支持4种算术运算符:++,――,+,-.指针只能与整数加减.指针运算的原则是:每当指针的值增加时,它将指向其基本类型的下一个元素的存储单元.减少时则指向上一个元素的存储单元. 1.++,――运算符,假设int型x的地址为200,且int型占4个字节,定义int *p;p=&x;则p++的地址将是204,而不是201,因为当指针p的值增加时,它都将指向下一个int型数据.减少时也是这样,如p――则,p的地址将是196.2.+,-,运算符,注意两个指针不能相加.例int *p;p=&x;假设x的地址为200,则p+9将的指针地址将是200+4*9=236,即p指向了从当前正指向的元素向下的第9个元素. 3.两指针相减,同类型的一个指针减去另一个指针的值将是两个指针分开的基本类型的元素的个数. 11.4 指针和数组 1.在C++语言中使用没有下标的数组名会产生一个指向数组中第一个元素的指针.如char x[20];char *p;p=x;此语句说明将x数组的第一个元素的地址赋给指针p. 2.*(p+4)和x[4]两句都可以访问数组中第5个元素,这里假设int x[33];int *p;p=x;因为p是指向数组x的第一个元素地址的指针,而p+4就是指向第五个元素的指针,而*(p+4)就是第五的个元素了. 3.p[i]语句相当于*(p+i)或x[i]即数组中第i+1个元素的值,假设char x[20];char *p;p=x; 11.5 字符串常量

动态内存分配(C语言)

实验报告 实验课程名称:动态内存分配算法 年12月1日

实验报告 一、实验内容与要求 动态分区分配又称为可变分区分配,它是根据进程的实际需要,动态地为之分配内存空间。在实验中运用了三种基于顺序搜索的动态分区分配算法,分别是1.首次适应算法2.循环首次适应算法3.最佳适应法3.最坏适应法分配主存空间。 二、需求分析 本次实验通过C语言进行编程并调试、运行,显示出动态分区的分配方式,直观的展示了首次适应算法循环首次适应算法、最佳适应算法和最坏适应算法对内存的释放和回收方式之间的区别。 首次适应算法 要求空闲分区链以地址递增的次序链接,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后在按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空余分区仍留在空链中。 优点:优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区,为以后到达的大作业分配大的内存空间创造了条件。 缺点:低址部分不断被划分,会留下许多难以利用的、很小的空闲分区即碎片。而每次查找又都是从低址部分开始的,这无疑又会增加查找可用空闲分区时的开

循环首次适应算法 在为进程分配内存空间时,不是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区。 优点:该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销。 最佳适应算法 该算法总是把能满足要求、又是最小的空闲分区分配给作业,避免大材小用,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。 缺点:每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的碎片。 最坏适应算法 最坏适应算法选择空闲分区的策略正好与最佳适应算法相反:它在扫描整个空闲分区或链表时,总会挑选一个最大的空闲区,从中切割一部分存储空间给作业使用。该算法要求,将所有的空闲分区,按其容量以大到小的顺序形成一空闲分区链。查找时,只要看第一个分区能否满足作业要求即可。 优点:可使剩下的空闲区不至于太小,产生碎片的可能性最小,对中小作业有利,同时,最坏适应算法查找效率很高。 缺点:导致存储器中缺乏大的空闲分区 三、数据结构 为了实现动态分区分配算法,系统中配置了相应的数据结构,用以描述空闲分区和已分配分区的情况,常用的数据结构有空闲分区表和空闲分区链

C++指针与动态分配内存new关键字专题

第一部分:指针 11.1 基础 1.指针是一个变量,它存储着另一个变量或函数的地址,也就是说可以通过指针间接地引用变量。指针变量包含一个地址,而且可以存储任何数据类型的内存地址,但指针变量却被声明为特定的数据类型,一个指向整型数据类型的指针不能存储一个浮点型的变量地址。 2.指针声明的形式为,数据类型*指针变量名;其中*星号是指针运算符,例如int *x;声明x为int型指针.11.2 指针运算符*和&地址运算符 1.&地址运算符是一元运算符,能反回它的操作数的内存地址.如y=&x;把变量x的地址输入到y中,它与x的值无关,比如x的值为1000,而x的地址为55则,y将接收到地址55. 2.*指针运算符是一元运算符,它是&运算符的相反形式,*运算符能反回位于其操作数所指定的地址的变量的值.例如y = &x;z = *y;假设x的值为1000,地址为55,则第二条语句说明z的值为1000,*y把由y所指向的内存的地址的变量x的值赋给z。*运算符可理解为“在地址中”,则z=*y可描术为“z接收了在址址y中的值。”,3.其实可以把*y当成一个变量来使用,即可以为*y赋值等,例如*y=100;(*y)++;等,但要注意的是对*y的操作相当于是对此指针指向的地址中的变量的操作,即对*y=100的赋值语句,相当于是x=100,而(*y)++则相当于x++。11.3 指针的运算 0.指针只支持4种算术运算符:++,――,+,-.指针只能与整数加减.指针运算的原则是:每当指针的值增加时,它将指向其基本类型的下一个元素的存储单元.减少时则指向上一个元素的存储单元. 1.++,――运算符,假设int型x的地址为200,且int型占4个字节,定义int *p;p=&x;则p++的地址将是204,而不是201,因为当指针p的值增加时,它都将指向下一个int型数据.减少时也是这样,如p――则,p的地址将是196.2.+,-,运算符,注意两个指针不能相加.例int *p;p=&x;假设x的地址为200,则p+9将的指针地址将是200+4*9=236,即p指向了从当前正指向的元素向下的第9个元素. 3.两指针相减,同类型的一个指针减去另一个指针的值将是两个指针分开的基本类型的元素的个数. 11.4 指针和数组 1.在C++语言中使用没有下标的数组名会产生一个指向数组中第一个元素的指针.如char x[20];char *p;p=x;此语句说明将x数组的第一个元素的地址赋给指针p. 2.*(p+4)和x[4]两句都可以访问数组中第5个元素,这里假设int x[33];int *p;p=x;因为p是指向数组x的第一个元素地址的指针,而p+4就是指向第五个元素的指针,而*(p+4)就是第五的个元素了. 3.p[i]语句相当于*(p+i)或x[i]即数组中第i+1个元素的值,假设char x[20];char *p;p=x; 11.5 字符串常量

相关文档
相关文档 最新文档