c - 为什么不能将指向整数数组的指针分配给指向整数的指针?
问题描述
在 c prime plus 中,它告诉我遵循了一些分配规则:
不能将指向整数数组的指针分配给指向整数的指针。
int *pt; int a[3][2];
pt=a; /* invalid */
不能将指向两个整数数组的指针分配给指向三个整数数组的指针。
int (*pt)[3]; int a[3][2];
pt=a; /* invalid */
坦率地说,我对这个解释感到困惑。因为虽然上面的指针是指向不同对象的指针,但是在内存中,指针都是以无符号的十六进制地址存储的,也就是说它们的存储形式是一样的。它们统一为 8 位(64 位操作系统)或 4 位(32 位操作系统)。那么为什么他们不能在根本原因上相互分配呢?因为编译器禁止这种类型的赋值?
解决方案
语言有类型的一个主要原因是帮助程序员避免犯错。指向不同类型事物的指针本身被视为不同类型。像这样的规则会捕获许多错误,程序员可能会将指针分配给错误的东西。
一个int
、一个 2 的数组int
和一个 3 的数组int
是不同类型的事物,因此指向它们的指针是不同类型的指针,C 的规则要求编译器诊断任何将一个分配给另一个的尝试。(这可以通过使用强制转换显式转换指针来覆盖,但在您了解有关使用不同类型的别名对象的 C 规则之前应该避免这种情况。)
最简单的是,要设置int *pt
指向 的第一个元素int a[3][2]
,您可以使用pt = &a[0][0];
或pt = a[0];
。在后者中,因为a
是一个由三个数组组成的数组,所以是一个由两个int
组成a[0]
的数组int
。当在表达式中使用而不是作为sizeof
或一元&
1的操作数时,它会自动转换为指向其第一个元素的指针,因此它的行为与&a[0][0]
.
顺便说一句,语句“……指针都以无符号的十六进制地址存储,这意味着它们具有相同的存储形式。它们统一为 8 位(64 位操作系统)或 4 位(32 位操作系统)”通常不正确。C 标准允许不同类型的指针具有不同的表示形式。这在现代 C 实现中并不常见,但确实存在。
脚注
1用于初始化字符数组的字符串文字也不会转换为指针。
推荐阅读
- python - 对字典的所有值使用“str”方法
- python - Python - 使用 DataReader 的数据帧的 Concat 列表
- node.js - 在javascript中解构某些东西
- amazon-web-services - 有没有办法检查 s3 对象是否存在并且大小不同?
- javascript - 在表格中单击时调用方法并传递链接值?
- node.js - 状态:'OVER_QUERY_LIMIT'
- tensorflow - Tensorflow 对象检测 API 未检测到边界框
- azure - Unity 上的 Azure 数据库
- ruby - 将“s”添加到数组中每个单词的末尾,给定数组中的第二个元素除外,仅使用一行代码
- fabric8 - Fabric8 Maven 插件 - 如何将 --rm 传递给构建选项?