C/C++静态数组与动态数组的区别
简介
以下三行代码有什么区别?
int a[10];
int *a = (int*)malloc(sizeof(int)*10);
int *a = new int[10];
- 第一行代码定义a为包含10个int类型元素的整形数组。
- 第二行和第三行分别使用的是C和C++来定义动态数组,他们的结果是相同的。a都可以表示为一个动态数组。
我们可以使用a[1]来取数组a的第1个元素。那他们有什么区别呢?
解释
我们从指针开始说起。所谓指针,就是用来存放内存地址的一个变量,首先,指针是个变量;其次,指针存放的是内存地址。
指针的定义中包含了一个重要的说明:指针中存放的内存地址处的内容应该如何解析。例如:int *a;
说明a
是一个指针,他存放的地址处的数据被解析为一系列连续的int
型数据。
那int a[10]
,可以说明a
是一个指针么?其实,这样说是不准确的。a
其实本身就是一个内存地址。只是我们在实际运行之前并不知道他真正代表哪个地址。就像宏在编译的时候被替换成宏定义的内容,静态数组a
实际上在执行的时候是被替换成真实的内存地址的。也就是说a
已经是内存地址了,不是变量。
那么对于int a[10]
和 int *b = new int[10]
,a[2]
和b[2]
有什么区别呢?
a[2]
,b[2]
在赋值符号=
的右端的时候。此时表示取a[2]
和b[2]
的值。对于a[2]
,首先a
代表的是个内存地址,在这个内存地址处偏移sizeof(int)*2
个字节,取连续sizeof(int)
个字节,并将其解析为int
类型的数。对于b[2]
,首先b
是一个指针,其值是一个内存地址,首先b
这个变量在内存中的地址被找到,然后取连续的sizeof(int*)
个字节,解析为一个内存地址,然后在这个地址处偏移sizeof(int)*2
个字节,取连续sizeof(int)
个字节,并将其解析为int
类型的数。a[2]
,b[2]
在赋值符号=
的左端的时候。表示向相应的内存位置赋值。赋值符号右端的表达式的结果不管是什么类型的值,都会被默认强制类型转化为int
型数据。对于a[2]
,a
代表的是个内存地址,在这个内存地址处偏移sizeof(int)*2
个字节,向连续的sizeof(int)
个字节内存中写入赋值号右端的结果。对于b[2]
,首先b
这个变量在内存中的地址被找到,然后取连续的sizeof(int*)
个字节,解析为一个内存地址,然后在这个地址处偏移sizeof(int)*2
个字节之后,向连续的sizeof(int)
个字节内存中写入赋值号右端的结果。
实验
试验下前面讨论的内容:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
int main(int argc, char** argv){
int a[10];
printf("%.16X\n", (uint64_t)(&a));
printf("%.16X\n", (uint64_t)(a));
int *b = new int[10];
printf("%.16X\n", (uint64_t)(&b));
printf("%.16X\n", (uint64_t)(b));
delete[] b; b = NULL;
return EXIT_SUCCESS;
}
某次执行结果:
000000003093F838
000000003093F838
000000003093F878
00000000309A8D90
根据输出结果,可以推断,a
和&a
的值是相同的,说明a
已经是地址了,取地址后还是原先的地址,所以两次地址是一样的。
后两次输出结果不同,是应为b
是一个指针,是变量,变量的地址与他存储的内存地址是不同的。
C/C++静态数组与动态数组的区别的更多相关文章
- JS 索引数组、关联数组和静态数组、动态数组
JS 索引数组.关联数组和静态数组.动态数组 数组分类: 1.从数组的下标分为索引数组.关联数组 var ary1 = [1,3,5,8]; //按索引去取数组元素,从0开始(当然某些语言实现从1开始 ...
- "《算法导论》之‘队列’":队列的三种实现(静态数组、动态数组及指针)
本文有关栈的介绍部分参考自网站数据结构. 1. 队列 1.1 队列的定义 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front) ...
- solidity定长数组和动态数组
固定长度的数组 固定长度数组声明 直接在定义数组的时候声明固定长度数组的值: uint[5] fixedArr = [1,2,3,4,5]; 可通过数组的length属性来获得数组的长度,进而进行遍历 ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
- VS中Debug和Realease、及静态库和动态库的区别整理
一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...
- iOS 静态库和动态库的区别&静态库的生成
linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...
- jsp中静态include和动态include的区别
jsp中静态include和动态include的区别 动态 INCLUDE 用 jsp:include 动作实现 <jsp:include page="included.jsp&quo ...
- JSP页面静态包含和动态包含的区别与联系
---恢复内容开始--- JSP页面静态包含和动态包含的区别与联系: 1.<%@ include file=" " %> 是指令元素,<jsp:include p ...
- iOS中的静态库与动态库,区别、制作和使用
如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...
- iOS 中的静态库与动态库,区别、制作和使用
如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...
随机推荐
- jacascript 滚动 scroll 与回到顶部
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 滚动 scroll scrollHeight 表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分: ...
- jQuery 事件绑定 和 JavaScript 原生事件绑定
总结一下:jQuery 事件绑定 和 JavaScript 原生事件绑定 及 区别 jQuery 事件绑定 jQuery 中提供了四种事件监听绑定方式,分别是 bind.live.delegate.o ...
- 理解error和exception之间的区别
很多程序员不清楚error和exception之间的区别,这区别对于如何正确的处理问题而言非常重要(见附1,"简要的叙述error和exception").就像Mary Campi ...
- [AHOI 2016初中组]迷宫
Description 小雪和小可可被困在了一个无限大的迷宫中. 已经知道这个迷宫有 N 堵环状的墙,如果把整个迷宫看作是一个二维平面,那么每一堵墙都是平面上一个圆.任意两个圆不相交,不重合,也不会相 ...
- [ZJOI2007]Hide 捉迷藏
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- codesforces 671D Roads in Yusland
Mayor of Yusland just won the lottery and decided to spent money on something good for town. For exa ...
- hdu 5868 Polya计数
Different Circle Permutation Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K ...
- 51 nod 1456 小K的技术(强连通 + 并查集)
1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...
- bzoj4447[Scoi2015]小凸解密码
4447: [Scoi2015]小凸解密码 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 150 Solved: 58[Submit][Status ...
- bzoj 4010: [HNOI2015]菜肴制作
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号 ...