当前位置:首页 > 芯闻号 > 充电吧
[导读]简介以下三行代码有什么区别?int a[10]; int *a = (int*)malloc(sizeof(int)*10); int *a = new int[10];第一行代码定义a为包含10个i

简介

以下三行代码有什么区别?

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#include#includeint main(int argc, char** argv){
    int a[10];
    printf("%.16Xn", (uint64_t)(&a));
    printf("%.16Xn", (uint64_t)(a));
    int *b = new int[10];
    printf("%.16Xn", (uint64_t)(&b));
    printf("%.16Xn", (uint64_t)(b));
    delete[] b; b = NULL;
    return EXIT_SUCCESS;
}

某次执行结果:

000000003093F838
000000003093F838
000000003093F878
00000000309A8D90

根据输出结果,可以推断,a&a的值是相同的,说明a已经是地址了,取地址后还是原先的地址,所以两次地址是一样的。

后两次输出结果不同,是应为b是一个指针,是变量,变量的地址与他存储的内存地址是不同的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

其实在 c++语言里面const修饰的才算是一个真正的常量,在 c 语言中 const 可以说是个“冒牌货”。为什么会这样?其实是 c++ 编译器对 const 进行了加强,当 c++ 编译器遇到常量声明时,不会像 c...

关键字: c++ C语言 const

返回函数的引用去初始化一个新的引用这个和前面一样,都是不会产生副本,但是现在是用返回值去初始化一个引用声明c,也就是说这时候变成了变量temp的别名,在c的生命周期内temp是一直有效的,这样做完全可以。

关键字: c++ 返回值 引用声明

C++是一种面向对象的高级程序设计语言,是C语言的超集。

关键字: c++ C语言

分析:这是Adobe 公司2007 年校园招聘的最新笔试题。这道题除了考察应聘者的C++ 基本功底外,还能考察反应能力,是一道很好的题目。 在Java 中定义了关键字final ,被final 修饰的

关键字: c++ class

泛型算法中的定制操作很多算法都会比较输入序列中的元素,通过定制比较动作,可以控制算法按照编程者的意图工作。本文以string排序为例进行说明,首先是缺省的排序动作: vector v{"This","

关键字: c++

为什么是lambda?讲了这么多天的lambda表达式,有一个很基本的问题没有回答:为什么叫lambda表达式呢?首先这个lambda就是罗马字母λ,lambda表达式即λ表达式。数学上有一个概念叫λ

关键字: c++

        假设我们有个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget 上进行某些带有优先权的处理:int priority () ; void processWi

关键字: c++ effective

判断链表中是否有环最经典的方法就是快慢指针,同时也是面试官大多想要得到的答案。       快指针pf(f就是fast的缩写)每次移动2个节点,慢指针ps(s为slow的缩写)每次移动1个节点,如果快

关键字: c++ 链表 快慢指针

转载请注明出处:http://blog.csdn.net/callon_h/article/details/52073268 引子 上一篇博客从内核驱动到android app讲述了android通过

关键字: c++ java

在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像。前提我们不需要知道这段代码是如何读取bmp格式

关键字: bmp c++
关闭
关闭