C/C++ 数组和指针及引用的区别

 更新时间:2017年07月26日 11:55:53   作者:Sweet_wen  
这篇文章主要介绍了C/C++ 数组和指针及引用的区别的相关资料,这里从汇编的角度来分析他们之间的区别,需要的朋友可以参考下

C/C++ 数组和指针及引用的区别

1.数组和指针的区别

(1)定义

数组是一个符号,不是变量,因而没有自己对应的存储空间。但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊。

(2)区别

a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也应该是数组,不可混淆
b.当作下标操作符时,指针和数组是等价的。a[i]会被编译器翻译成*(a+i).
c.当数组声明被用作函数形参的时候,数组实际会被当作指针来使用。

(3)从汇编角度分析

**int i = 10;**
00C44CC8 mov     dword ptr [i],0Ah 
**int * p = &i;** (1)
00C44CCF lea     eax,[i] 
00C44CD2 mov     dword ptr [p],eax 
**int arr[5] = {0};**(2)
00C44CD5 mov     dword ptr [arr],0 
00C44CDC xor     eax,eax 
00C44CDE mov     dword ptr [ebp-30h],eax 
00C44CE1 mov     dword ptr [ebp-2Ch],eax 
00C44CE4 mov     dword ptr [ebp-28h],eax 
00C44CE7 mov     dword ptr [ebp-24h],eax 

解释:

(1)lea先取i的地址,然后存入p指向的空间中,足够证明p有自己的空间。

(2)没给数组明分配空间

2. 数组和引用区别

(1)定义

引用是是给一个变量起的别名,引用必须要初始化,引用一经定义不能被改变,初始化的值必须要能取地址,访问引用变量,永远访问的是它所引用的变量的内存。

(2)区别

C语言中没有引用,C++11之前只有一级引用,之后有左引用和右引用。

(3)汇编角度

**int i = 10;**
00ED4CBE mov     dword ptr [i],0Ah 
**int &a = i;**
00ED4CC5 lea     eax,[i] 
00ED4CC8 mov     dword ptr [a],eax 

如有疑问,请留言或者到本站社区交流讨论,共同进步,感谢阅读,希望能帮助到到大家,谢谢大家对本站的支持!

相关文章

  • C/C++举例讲解关键字的用法

    C/C++举例讲解关键字的用法

    相对于其他语言来说,C语言的关键字算是少的了。在C98中关键子总共只有32个,我们来分析一下部分关键字在C/C++中它独特的作用
    2022-05-05
  • 如何通过wrap malloc定位C/C++的内存泄漏问题

    如何通过wrap malloc定位C/C++的内存泄漏问题

    用C/C++开发的程序执行效率很高,但却经常受到内存泄漏的困扰。本文提供一种通过wrap malloc查找memory leak的思路。
    2021-05-05
  • 详解C语言数据结构之栈

    详解C语言数据结构之栈

    这篇文章主要为大家介绍了C语言数据结构之栈,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C++四种cast使用详细介绍

    C++四种cast使用详细介绍

    本文主要介绍了C++四种cast使用详细介绍,今天我们要来讲的是显式类型转换,C++提供了四种显式类型转换,分别是:static_cast、dynamic_cast、const_cast、reinterpret_cast,感兴趣的可以了解一下
    2022-07-07
  • c++中的前向声明用法解读

    c++中的前向声明用法解读

    这篇文章主要介绍了c++中的前向声明用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 数据结构与算法:单向链表实现与封装

    数据结构与算法:单向链表实现与封装

    今天小编就为大家分享一篇关于数据结构与算法:单向链表实现与封装,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++中的封装、继承、多态理解

    C++中的封装、继承、多态理解

    这篇文章主要介绍了C++中的封装、继承、多态介绍,需要的朋友可以参考下
    2020-01-01
  • C语言二叉树的三种遍历方式的实现及原理

    C语言二叉树的三种遍历方式的实现及原理

    这篇文章主要介绍了C语言二叉树的三种遍历方式的实现及原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • c语言排序之归并排序(递归和非递归)

    c语言排序之归并排序(递归和非递归)

    这篇文章主要介绍了 c语言排序之归并排序(递归和非递归),归并就是把两个或多个序列合并,本文主要介绍二路归并,下文相关资料需要的小伙伴可以参考一下
    2022-04-04
  • C语言中的文件读写fseek 函数

    C语言中的文件读写fseek 函数

    这篇文章主要介绍是我是C语言中的文件读写fseek 函数的相关资料,fseek 函数用来移动文件流的读写位置;就好比播放器,可以直接拖拽到精彩的时间点一样,下面我们就来详细介绍该内容吧,感兴趣的小伙伴可以参考一下
    2021-10-10

最新评论