IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 数组与指针的区别与联系 -> 正文阅读

[C++知识库]数组与指针的区别与联系

1 引言

数组并非指针,在初学C语言时,我们会觉得”数组和指针是相同的“,实际上,这是一种非常危险的说法,并不完全正确。下面完整地解释一下数组什么时候等同于指针,什么时候又不等同于指针以及原因所在。

//文件1
int mango[10];

//文件2
extern int *mango;

上面程序演示了一个错误,文件1定义了数组mango,文件2想使用它,声明它为指针。但实际上它们的类型并不匹配,相当于把整数和浮点数混为一谈。
但是为什么人们会认为指针和数组始终是应该可以互换的呢?答案是对数组的引用总是可以写成对指针的引用,而且确实存在一种指针和数组的定义完全相同的上下文环境。不幸的是,这只是数组的一种极为普通的用法,并非所有情况下都是如此。

2 数组和指针的区别

它们访问过程不一样。如果是数组,数组名就代表了数组第一个元素的地址,如果需要访问数组中的元素,编译器可以直接进行操作,因为有地址(其他元素加上偏移量就可以),并不需要增加指令首先取得具体的地址。相反,对于指针,必须首先在运行时取得它的当前值,然后才能对它进行解除引用操作。

  1. 对数组下标的引用
    char a[9] = “abcdefgh”; c = a[i];
    编译符号表具有一个地址9980
    运行时步骤1:取i的值,将它与9980相加。
    运行时步骤2:取地址(9980+i)的内容。

  2. 对指针的引用
    char *p; c = *p;
    编译器符号表有一个符号怕,它的地址为4642
    运行时步骤1:取地址4642的内容,比如是’5081‘。
    运行时步骤2:取地址5081的内容。
    如果声明extern char *p,它将告诉编译器p是一个指针,它指向的对象是一个字符。为了取得这个字符,必须得到地址p的内容,把它作为字符的地址并从这个地址中取得这个字符。指针的访问要灵活得多,但需要增加一次额外得提取。

Note:出现在赋值符号左边的符号有时被称为左值,出现在赋值符号右边的值有时被称为右值。编译器会为每个变量分配一个地址(左值),产生一个符号表。这个地址在编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器中。

数组和指针的其他区别

指针数组
保存数据的地址保存数据
间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。如果指针有一个下标[i],就把指针的内容加上i作为地址,从中提取数据直接访问数据,a[i]只是简单地以a+i为地址取得数据
通常用于动态数据结构通常用于存储固定数据类型相同的元素
相关的函数为malloc()、free()隐式分配和删除
通常指向匿名数据自身即为变量名

3 什么时候数组与指针相同

所有作为函数参数的数组名总是可以通过编译器转换为指针。在其他所有情况下,数组的声明就是数组,指针的声明就是指针,两者不能混淆。但在使用数组(在语句或表达式中引用)时,数组总是可以写成指针的形式,两者可以互换。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:30:29  更:2022-03-21 20:33:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:12:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码