首页 > 解决方案 > 为什么不能将指向整数数组的指针分配给指向整数的指针?

问题描述

在 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 位操作系统)。那么为什么他们不能在根本原因上相互分配呢?因为编译器禁止这种类型的赋值?

标签: carrayspointers

解决方案


语言有类型的一个主要原因是帮助程序员避免犯错。指向不同类型事物的指针本身被视为不同类型。像这样的规则会捕获许多错误,程序员可能会将指针分配给错误的东西。

一个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用于初始化字符数组的字符串文字也不会转换为指针。


推荐阅读