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语言——从链接属性方面看指针变(常)量与数组名的不同 -> 正文阅读

[C++知识库]C语言——从链接属性方面看指针变(常)量与数组名的不同

一、 之前比较明显的不同

我们已经知道:

  • 对数组名取地址,得到的仍然是指向数组第一个元素的指针变量;而对指针变(常)量取地址,得到的是指向指针类型的指针。
  • sizeof (数组名),得到的是数组的长度,sizeof (指针变/常量)得到的指针本身的长度

二、在使用链接属性上体现的不同

这一点在《C和指针》这本书中,有所介绍。不过通过编译成汇编代码来看,更容易理解。

// sample1.c
extern int *a;
extern int b[];

main() {
	int x, y;
	x = a[3];
	y = b[3];
}
// sample2.c
int a[10];
int *b = a;

可以看到在sample1.c中,a被声明为指针变量,b被声明为数组名,而在sample2.c中两者反了过来。由于编译器会对外链的指针变量和数组名进行不同的处理,这样的调换会造成错误。

在sample1.c中,对于被声明为指针变量的a,编译器会对其进行间接访问取得一个指针(所以外链得到的值实际上是指向实际值的指针),然后对这个指针加3得到a[3]的地址,而由于a实际上是一个数组名,经过外链后,a指向的是实际上是数组的第一个元素,所以对其进行间接访问得到的是一个整型值而非指针。

同样的,b被声明为数组,而b实际上是一个指针变量,因此编译器按照指针变量来处理也会引起错误

看一下汇编代码

	movq	.refptr.a(%rip), %rax
	movq	(%rax), %rax  # 间接访问,在本例中取得取得的实际上是一个整型值,而非指针变量
	movl	12(%rax), %eax
	movl	%eax, -4(%rbp)
	movq	.refptr.b(%rip), %rax
	movl	12(%rax), %eax   # refptr.b是一个指向指针的指针,所以这里获取的是一个未知值
	movl	%eax, -8(%rbp)

产生这种情况的原因在于,refptr.a实际上是&a,refptr.b实际上是&b,由于对指针变量取地址得到指向指针的指针,而对数组名取地址得到的是指向数组第一个元素的指针,因此对于数组和指针变量编译器会进行不同的处理,所以如果混用的话,就会出错。

还好,我觉得这种错误是很少见的,写一下加深印象。

Goodbye guys

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2021-10-20 12:19:11  更:2021-10-20 12:21:31 
 
开发: 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:37:42-

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