C++|静态数组、动态数组、变长数组、柔性数组、vector数组
liuian 2025-01-14 15:19 61 浏览
数组的重要性不言而喻,数组连同链表构成其它数据结构的基础。
数组集中存储数据,元素通过索引来访问。链表可以分散存储数据节点,通过指针来建立节点之间的联系。
数组根据其长度,类型是否可变,以及数据存储的内存空间的不同,有静态数组、动态数组、变长数组、柔性数组、vector数组等类型。
1 静态数组
静态数组是指其长度是一个编译器确定的常量,数组长度固定不变,存储在栈空间或全局空间。
const int size = 11;
int arr[size] = {0};静态数组虽然在空间使用上不灵活,或可能存在浪费,但却有较高的时间使用效率。
2 动态数组
动态数组是指其长度在运行期确定,也就是长度可变,存储在堆空间。
int *arr = (int*)malloc(sizeof(int)*11);
// arr使用,其使用空间不能超过分配的空间,否则free时会出错
free(arr);3 变长数组
变长数组是指数组声明时其长度可以用一个非常量的整型变量来表示:
int n = 11;
int arr2[n] = {0} // C99变长数组用整型变量或表达式来声明或定义,并不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的。
4 柔性数组
柔性数组是指通过结构体来实现一个长度可变长的动态数组。
#include <stdio.h>
#include <stdlib.h>
void foo()
{
struct ST{
int n;
int arr[0];
};
//ST s;
//s.n = 10;
//s.arr = (int[])malloc(sizeof(int)*s.n);
struct ST* st = (struct ST*)malloc(sizeof(struct ST)+24*sizeof(int));
st->n = 10;
for(int i=0;i<st->n;i++)
{
st->arr[i] = i+1;
}
for(i=0;i<st->n;i++)
{
printf("%d ",st->arr[i]);
}
struct ST* newst = (struct ST*)realloc(st,sizeof(int)*21);
if(newst!=NULL)
st = newst;
st->n = 20;
for(i=10;i<st->n;i++)
st->arr[i] = i+1;
printf("\n");
for(i=0;i<st->n;i++)
{
printf("%d ",st->arr[i]);
}
free(st); // 当过量使用时,free会出错,如只分配了44Byte,却使用到了20个int
}
void foo2()
{
struct ST{
int n;
int *arr;
};
struct ST* st = (struct ST*)malloc(sizeof(struct ST));
st->n = 10;
st->arr = (int*)malloc(sizeof(int)*10);
for(int i=0;i<st->n;i++)
{
st->arr[i] = i+1;
}
for(i=0;i<st->n;i++)
{
printf("%d ",st->arr[i]);
}
int* newarr = (int*)realloc(st->arr,94);
if(newarr!=NULL)
st->arr = newarr;
st->n = 20;
for(i=10;i<st->n;i++)
st->arr[i] = i+1;
printf("\n");
for(i=0;i<st->n;i++)
{
printf("%d ",st->arr[i]);
}
free(st->arr);
free(st);
st->arr=NULL;
st=NULL;
}
int main()
{
foo();
printf("\n");
foo2();
getchar();
return 0;
}
通常通过封装一个结构体(结构体中包含一个指针,由指针指向一块动态内存)来构建一个动态数组,并做适当的边界检查。但相对而言,柔性数组也有其优势所在。柔性数组只需使用1次malloc,另外,也少了一个指针空间。且内存空间是连续的,可以避免内存碎片,也可以提高缓存命中率。
5 vector数组
vector是一个STL容器(数据结构),属类型泛化、动态长度的数组。
const int size = 11;
int arr[size] = {0};
std::vector<int> vc(arr,arr+size); // <vector>
for(int i=0;i<50;i++)
vc.push_back(i+1);
printf("%d\n",vc[60]); // 50对于C++来说,正如推荐使用智能指针代替祼指针,使用string类代替C风格字符串,vector也是其推荐使用的数组类型,可以避免数组溢出的风险。
-End-
- 上一篇:Java集合类之Vector
- 下一篇:C++STL:顺序容器之vector
相关推荐
- 惠普1020打印机怎么连接电脑
-
1,先安装好打印机,将打印机的连接线接到电脑上,打开打印机电源。2,打开电脑,然后使用随机的打印机驱动程序或者到打印机的官网下载当前系统的驱动程序,然后点击安装。3,安装完成后,点击打印测试页,如...
- win7打印机共享需要密码(win7共享打印机需要输入用户名和密码怎么办)
-
第一步:我们打开打印机文件夹,然后在打印机的图标上面点击鼠标右键,在弹出的对话框里面选择共享选项。如果没有这个选项,我们就需要在文件夹里面找到文件夹选项,在弹出的对话框理面找到选择简单文件共享,然后...
- windows7是什么样的(windows7是什么型号)
-
1.Windows7驱动器是一种用于安装和管理硬件设备的软件程序。2.Windows7驱动器的作用是使计算机能够与各种硬件设备进行通信和交互。它通过提供必要的指令和接口,使硬件设备能够被操作系...
-
- 电脑序列号查询方法(电脑序列号查询方法是什么)
-
系统win71打开电脑,找到计算机图标,单击鼠标右键,出现菜单后,点击属性2进去页面,找到产品id,产品id右侧就是Windows序列号了方法/步骤1/3分步阅读快捷键win+r打开运行菜单,输入regedit,点击确定。2/3打开注册表,...
-
2025-12-26 05:55 liuian
- 摄像头软件app有哪些(摄像头软件叫什么名字)
-
和家亲监控摄像头好用,这是中国移动推出的一款智能设备管理app,其功能十分强大,不仅可以链接多个智慧设备,帮助用户在手机上管理智能家居,而且还可以在调整观看的视角,画质等等,以及支持回放和储存等等功能...
- 笔记本电脑键盘不能用了怎么办
-
如果是键盘驱动异常,更新键盘驱动即可,1、在开始里找到windows系统。2、打开控制面板,选择硬件与声音。3、点击设备和打印机选择笔记本,点击硬件找到键盘。4、点击改变设置,选择更改驱动程序。5、选...
- 深圳平板电脑厂家排名(深圳平板电脑厂家排名榜)
-
乐福尔的平板电脑还不错。原因是其功能全面,触控灵敏,屏幕显示效果好,外观设计美观,适合用来阅读、写作、观看视频等多种用途。此外,乐福尔平板电脑还具有长时间续航和较快的处理速度,能够满足用户日常使用的需...
- 苹果手机五笔输入法(五笔输入法手机版下载)
-
苹果手机有五笔的输入法,苹果手机自带输入法无五笔输入法,需要在AppStore下载一个五笔输入法,然后再添加到键盘中。工具/材料:苹果6手机1、打开手机桌面的appstore应用软件。2、然后搜索...
- 万能app破解器(万能app软件破解器)
-
1、以现有的技术手段,是没有办法破解WPA的加密方式(现在基本上全部WIFI的加密方式),WPA的加密方式安全性很高,根本就破不了。2、即使破解密码,人家也有可能设置了MAC地址过滤,还是上不去。3、...
- 笔记本电脑自带摄像头怎么开启
-
要使用笔记本电脑自带的摄像头,请按照以下步骤操作:1.打开你的电脑,进入桌面。2.定位摄像头,通常在笔记本电脑的上部或者展开的屏幕的中央位置。3.双击摄像头图标,或者在键盘上按下对应的快捷键,以...
- 怎么知道wifi密码(手机连接上wifi怎么知道wifi密码)
-
关于这个问题,如果您想查看已经连接过的无线网络密码,请按照以下步骤操作:对于Windows10:1.点击任务栏中的WiFi图标,选择“网络和Internet设置”2.在“网络和Internet设...
- 电脑如何调出任务管理器(电脑如何调出任务管理器快捷键)
-
在Windows操作系统中,可以通过以下方法调出任务管理器:使用快捷键:按下“Ctrl+Shift+Esc”快捷键组合,即可快速打开任务管理器。使用组合键:按下“Ctrl+Alt+...
- win732位怎么还原系统(win732位gho)
-
系统安装失败,在以前的系统没有备份的情况下,是不能恢复的。只要诺顿开始运行,,不管进度条在什么位置,原系统都被格式化。如果有备份文件,那么方法是:1、打开系统备份还原软件:2、点击浏览,找到备份文件,...
- 电脑装什么杀毒软件(电脑装什么杀毒软件最安全)
-
好用的电脑杀毒软件,目前比较知名的有360杀软,腾讯电脑管家,金山毒霸,瑞星等杀毒软件,至于哪一个更好用,就看你自己的习惯了,我个人觉得360比较让人放心一些,这些年也一直用着360,比较安全有保证,...
- u盘uefi是什么意思(u盘用uefi模式启动)
-
u盘启动盘是指在U盘里安装PE版的操作系统后,把系统设置成从U盘启动,然后电脑开机就从U盘开始重装系统。UEFI,全称“统一的可扩展固件接口”,是一种详细描述类型接口的标准。这种接口用于操作系统自动...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
