数组多维字符串数组初始化静态内存分派会要

字符串数组  时间:2021-02-10  阅读:()

多维字符串数组的初始化-静态内存分派[会要]

多维字符串数组的初始化-动态内存分配

编程学习,二维字符串数组的初始化,动态内存分配

动态内存分配

1.堆内存分配:

C/C++定义了4个内存区间:代码区全局变量与静态变量区局部变量区即栈区动态存储区即堆

(heap)区或自由存储区(free store) 。

堆的概念:

通常定义变量(或对象) 编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的

大小从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;

有些操作对象只在程序运行时才能确定这样编译时就无法为他们预定存储空间只能在程序运

行时系统根据运行时的要求进行内存分配这种方法称为动态存储分配。所有动态存储分配都在堆

区中进行。

当程序运行到需要一个动态分配的变量或对象时必须向系统申请取得堆中的一块所需大小的存贮空

间用于存贮该变量或对象。当不再使用该变量或对象时也就是它的生命结束时要显式释放它所

占用的存贮空间这样系统就能对该堆空间进行再次分配做到重复使用有限的资源。

2.堆内存的分配与释放

堆空间申请、释放的方法:

在C++中 申请和释放堆中分配的存贮空间分别使用new和delete的两个运算符来完成,指针变量名

=new类型名(初始化式);delete指针名;

例如:1、 int*pi=new int(0);

它与下列代码序列大体等价:

2、 int ival=0,*pi=&ival;

区别:pi所指向的变量是由库操作符new()分配的位于程序的堆区中并且该对象未命名。

堆空间申请、释放说明:

?.new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象都是通过

该指针来间接操作的而且动态创建的对象本身没有名字。

?.一般定义变量和对象时要用标识符命名称命名对象而动态的称无名对象(请注意与栈区中的临

时对象的区别两者完全不同:生命期不同操作方法不同临时变量对程序员是透明的)。

?.堆区是不会在分配时做自动初始化的(包括清零) 所以必须用初始化式(initializer)来显式初

始化。 new表达式的操作序列如下:从堆区分配对象然后用括号中的值初始化该对象。

3.堆空间申请、释放演示:

?.用初始化式(initializer)来显式初始化int*pi=new int(0);

?.当pi生命周期结束时必须释放pi所指向的目标:delete pi;

注意这时释放了pi所指的目标的内存空间也就是撤销了该目标称动态内存释放(dynamic memorydeallocation) 但指针pi本身并没有撤销它自己仍然存在该指

针所占内存空间并未释放。

4.在堆中建立动态一维数组

?申请数组空间:

指针变量名=new类型名[下标表达式];

注意: “下标表达式”不是常量表达式即它的值不必在编译时确定可以在运行时确定。

?释放数组空间:delete []指向该数组的指针变量名;

注意:方括号非常重要的如果d e l et e语句中少了方括号 因编译器认为该指针是指向数组第一个元

素的会产生回收不彻底的问题(只回收了第一个元素所占空间) 加了方括号后就转化为指向数组

的指针 回收整个数组。 delete []的方括号中不需要填数组元素数系统自知。即使写了编译器

也忽略。

#include<iostream.h>

#include<string.h>void main(){int n;char*pc;cout<<"请输入动态数组的元素个数"<<endl;cin>>n;//n在运行时确定可输入17pc=new char[n];//申请17个字符(可装8个汉字和一个结束符)的内存空间s trcpy(pc, “堆内存的动态分配” );//cout<<pc<<endl;delete []pc;//释放pc所指向的n个字符的内存空间return; }

5.动态一维数组的说明

?变量n在编译时没有确定的值而是在运行中输入按运行时所需分配堆空间这一点是动态分配

的优点可克服数组“大开小用”的弊端在表、排序与查找中的算法若用动态数组通用性更佳

。一定注意:delete []pc是将n个字符的空间释放而用delete pc

则只释放了一个字符的空间;

?如果有一个char*pc1 令pc1=p 同样可用delete []pc1来释放该空间。尽管C++不对数组作边

界检查但在堆空间分配时对数组分配空间大小是纪录在案的。

?没有初始化式(initializer) 不可对数组初始化。

6.指针数组和数组指针

指针类型:

(1)int*ptr;//指针所指向的类型是int (2)char*ptr;//指针所指向的的类型是char

(3)int**ptr;//指针所指向的的类型是int* (也就是一个int*型指针)

(4)int (*ptr)[3];//指针所指向的的类型是int()[3] //二维指针的声明

指针数组:

一个数组里存放的都是同一个类型的指针通常我们把他叫做指针数组。

比如int*a[2];它里边放了2个int*型变量.(指针数组)int*a[2];a[0]=new int[3];a[1]=new int[3];delete a[0];delete a[1];

注意这里是一个数组不能delete [] ;

数组指针:

一个指向一维或者多维数组的指针.int*b=new int[10];指向一维数组的指针b;注意这个时候释放空间一定要delete [] ,否则会造成内存泄露 b就成为了空悬指针int (*b2)[10]=new int[10][10];注意这里的b2指向了一个二维int型数组的首地址.

注意:在这里 b2等效于二维数组名但没有指出其边界即最高维的元素数量但是它的最低维数

的元素数量必须要指定就像指向字符的指针即等效一个字符串,不要把指向字符的指针说成指向

字符串的指针。int(*b3) [30] [20];//三级指针――>指向三维数组的指针;

int (*b2) [20];//二级指针;――>指向二维数组的指针;b3=new int [1] [20] [30];b2=new int [30] [20];

删除这两个动态数组可用下式:delete []b3;//删除(释放)三维数组;delete []b2;//删除(释放)二维数组;在堆中建立动态多维数组new类型名[下标表达式1] [下标表达式2]„„;

例如:建立loat (*cp)[30][20] ;//指向一个30行20列数组的指针指向二维数组的指针cp=new float [15] [30] [20];//建立由15个30*20数组组成的数组;

注意:cp等效于三维数组名但没有指出其边界即最高维的元素数量就像指向字符的指针即等效

一个字符串,不要把指向字符的指针说成指向字符串的指针。这与数组的嵌套定义相一致。

总结如下方法:

指针对应关系为char*a[6]<=>char**a//在函数传递参数时候很容易出错char a[5][6]<=>char(*a)[6]int a[50][100];int*p=&a[0][0];a[i][j]<=>*(p+100*i+j);

或:int (*p)[100];p=a;a[i][i]<=>*(*(p+i)+j);

char*a[10];//指针数组for(i=0;i<10;i++) a[i]=new char[10];for(i=0;i<10;i++)delete [] a[i];#include<iostream.h>#include<stdlib.h>int main()

{int (*p)[3];p=new int [2][3]; int i,j ;for(i=0;i<2;i++) for(j=0;j<3;j++)p[i][j]=rand()%100;for(i=0;i<2;i++)

{cout<<endl;for(j=0;j<3;j++)cout<<p[i][j]<<ends;

}delete []p; return 0;

}

#include<iostream.h>#include<stdlib.h>int main()

{char**a;//或者用上面的指针数组的方法也可

以a=new char*[2];for(int i=0;i<2;i++)a[i]=new char [10];for(i=0;i<2;i++)cin.getline(a[i],9);for(i=0;i<2;i++)cout<<a[i]<<endl;for(i=0;i<2;i++)delete []a[i];delete []a;//不要忘了

a=NULL;return 0;}

10gbiz七月活动首月半价$2.36/月: 香港/洛杉矶CN2 GIA VPS

10gbiz怎么样?10gbiz 美国万兆带宽供应商,主打美国直连大带宽,真实硬防。除美国外还提供线路非常优质的香港、日本等数据中心可供选择,全部机房均支持增加独立硬防。洛杉矶特色线路去程三网直连(电信、联通、移动)回程CN2 GIA优化,全天低延迟。中国大陆访问质量优秀,最多可增加至600G硬防。香港七星级网络,去程回程均为电信CN2 GIA+联通+移动,大陆访问相较其他香港GIA线路平均速度更...

Buyvm:VPS/块存储补货1Gbps不限流量/$2起/月

BuyVM测评,BuyVM怎么样?BuyVM好不好?BuyVM,2010年成立的国外老牌稳定商家,Frantech Solutions旗下,主要提供基于KVM的VPS服务器,数据中心有拉斯维加斯、纽约、卢森堡,付费可选强大的DDOS防护(月付3美金),特色是1Gbps不限流量,稳定商家,而且卢森堡不限版权。1G或以上内存可以安装Windows 2012 64bit,无需任何费用,所有型号包括免费的...

UCloud:美国云服务器,洛杉矶节点大促,低至7元起/1个月

ucloud美国云服务器怎么样?ucloud是国内知名云计算品牌服务商家,目前推出全球多地机房的海外云服务器。UCloud主打的优势是海外多机房,目前正在进行的2021全球大促活动参与促销的云服务器机房就多达18个。UCloud新一代旗舰产品快杰云服务器已上线洛杉矶节点,覆盖北美和亚太地区,火热促销中, 首月低至7元,轻松体验具备优秀性能与极高性价比的快杰云服务器。点击进入:ucloud美国洛杉矶...

字符串数组为你推荐
解压程序下RAR那个解压软件cornerradius怎么用代码写一个圆角矩形?yy频道中心yy语音怎么进频道中心ghostxp3GHOSTxp sp3系统有什么优点和缺点???不兼容vivo手机和软件不兼容怎么办?中小企业信息化小企业需要信息化吗?需要的话要怎么实现信息化呢?ios系统苹果手机的系统是什么?网站优化方案网站优化方案如何写?发邮件怎么发怎样发送邮件服务器连接异常服务器连接异常是怎么回事啊,怎么解决
长沙域名注册公司 武汉域名注册 绍兴服务器租用 网通服务器租用 腾讯云盘 中国特价网 国外在线代理 网站cdn加速 腾讯实名认证中心 可外链网盘 购买国外空间 网站在线扫描 我的世界服务器ip 东莞服务器托管 中国域名 winserver2008r2 标准机柜 hosts文件修改 weblogic部署 bwg 更多