这个陈述是否正确?任何"TYPE"指针都可以指向任何其他类型吗?因为我相信,仍然有疑虑.
为什么为明确类型声明指针?例如int还是char?
我可以得到的一个解释是:如果一个int类型指针指向一个char数组,那么当指针递增时,指针将从0位置跳到2位置,跳过它们之间的1个位置(因为int size = 2).
也许是因为指针只保存值的地址,而不是值本身,即int或double.
我错了吗?这个陈述是否正确?
指针可以互换,但不是必需的.
特别是,在某些平台上,某些类型需要与某些字节边界对齐.因此,虽然a char可能在内存中的任何位置,但int可能需要在4字节边界上.
另一个重要的潜在区别是功能指针.
在许多平台上,指向函数的指针可能无法与指向数据类型的指针互换.
需要重复的是:这是特定于平台的.
我相信英特尔x86架构会对所有指针都一视同仁.
但是你可能会遇到其他不正确的平台.
每个指针都是某种特定的类型。有一个特殊的通用指针类型void*可以指向任何对象类型,但是必须void*先将a转换为某些特定的指针类型,然后才能取消引用它。(我忽略了函数指针类型。)
您可以将指针值从一种指针类型转换为另一种。在大多数情况下,将指针从转换foo*为bar*并返回到foo*会产生原始值-但实际上并非在所有情况下都可以保证。
您可以导致类型的指针foo*,以点类型的对象bar,但(一)它通常是一个坏主意,和(b)在某些情况下,它可能无法正常工作(比如,如果目标类型foo和bar大小不同或比对要求)。
您可以逃脱诸如此类的事情:
int n = 42;
char *p = (char*)&n;
Run Code Online (Sandbox Code Playgroud)
这导致p指向n-但*p没有给您的值n,它给您的nas 的第一个字节的值char。
指针算术的不同行为只是具有不同指针类型的部分原因。主要是关于类型安全。如果您具有类型的指针int*,则可以合理地确定(除非您做了不安全的操作)它实际上指向了一个int对象。而且,如果您尝试将其视为其他类型的对象,则编译器可能会抱怨它。
基本上,出于相同的原因,我们具有不同的指针类型,而我们具有其他不同的类型:因此,在编译器的帮助下,我们可以跟踪每个对象中存储了哪种类型的值。
(有些语言只具有未类型化的通用指针。在这种语言中,避免类型错误更加困难,例如存储一种类型的值并意外地像对待另一种类型一样访问它。)
| 归档时间: |
|
| 查看次数: |
4399 次 |
| 最近记录: |