静态数组与动态数组(都是顺序表)

静态数组与动态数组(都是顺序表)

一、定义
动态数组是在程序运行时创建的,可以根据用户需要,有效利用存储空间,分配的存储空间在堆上:
int *h=new int[10];//可以对h重新赋值

静态数组在声明时就已经确定大小的数组,即数组元素的个数固定不变,分配的存储空间在栈上::
int h[10];//不可以对h重新赋值

二、举例
int h[10];
int *h = (int*)malloc(sizeof(int)*10);
int *h = new int[10];

第一行代码定义h为包含10个int类型变量的整形数组。
第二行和第三行分别使用的是C和C++来定义动态数组,他们的结果是相同的。h都可以表示为一个动态数组。
都可以用h[1]来取数组a的第1个元素,有什么区别呢?

三、解释
所谓指针变量,就是用来存放内存地址的变量。

指针变量的定义中包含了一个重要的问题:指针变量中存放的内存地址处的内容应该如何解析。例如:int *h; 说明h是一个指针变量,他存放的地址处的数据被解析为一int型数据。

那int h[10],可以说明h是一个指针么?其实,这样说是不准确的。h其实本身就是一个内存地址。只是我们在实际运行之前并不知道他真正代表哪个地址。就像宏在编译的时候被替换成宏定义的内容,静态数组h实际上在执行的时候是被替换成真实的内存地址的。也就是说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)个字节内存中写入赋值号右端的结果。

四、测试
#import <Foundation/Foundation.h>

int main(int argc, char** argv){
    int a[10];
    printf("%.16llX\r\n", (uint64_t)(&a));
    printf("%.16llX\r\n", (uint64_t)(a));
    
    int *b = new int[10];
    printf("%.16llX\r\n", (uint64_t)(&b));
    printf("%.16llX\r\n", (uint64_t)(b));
    delete[] b; b = NULL;
    
    return 0;
}

控制台运用结果:

00007FFEEFBFF5A0
00007FFEEFBFF5A0
00007FFEEFBFF588
000000010044B090

根据输出结果,可以推断,a和&a的值是相同的,说明a已经是地址了,取地址后还是原先的地址,所以两次地址是一样的。
后两次输出结果不同,是应为b是一个指针,是变量,变量的地址与他存储的内存地址是不同的。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值