//观察到此代码的输出为 4 4 2 ? 我不明白为什么 ptr3 是 2?请帮助
#include<stdio.h>
int main()
{
char huge *near *far *ptr1;
char near *far *huge *ptr2;
char far *huge *near *ptr3;
printf("%d, %d, %d\n", sizeof(ptr1), sizeof(ptr2), sizeof(ptr3));
return 0;
}
near
, far
, 和huge
指针是非标准的。
在支持它们的实现中(通常用于非常旧的 x86 系统),内存中的特定位置可以由段和偏移量指定。一个near
指针只包含一个偏移量,使段隐含。因此它比far
指针需要更少的空间。
现代编译器不使用任何这些关键字。我建议你给自己找一个更新的编译器;有很多免费的。
有关更多信息,请参阅此问题。
顺便说一句,printf 的"%d"
格式需要一个 type 的参数int
;sizeof
产生 type 的结果size_t
,这是一个不同的类型。您可以将printf
呼叫更改为:
printf("%d, %d, %d\n", (int)sizeof ptr1, (int)sizeof ptr2, (int)sizeof ptr3);
(这样做的现代方法是:
printf("%zu, %zu, %zu\n", sizeof ptr1, sizeof ptr2, sizeof ptr3);
但是支持near
和far
指针的实现可能不够现代,无法支持"%zu"
,这是在 C99 中引入的。)
只是为了消除一层混乱,因此您可以使用其他答案。
指针的声明near
如下所示:
type near* variable;
或者像这样:
near type* variable;
type
任何类型在哪里。在您的示例中,有人试图使您感到困惑,因为type
它本身就是指针类型:char far *huge *
. 但是,无论它指向什么,一个near
指针都占用 2 个字节。
(我猜有人试图故意混淆你,因为这样的构造不可能出现在真实代码中)
我认为您使用的是旧的编译器(可能是 turboc c)。最新的编译器不支持此功能。
Near指针没有选择器——它们有一个隐含的选择器。他们可以访问 286 及更早版本上的 64k 虚拟地址空间和 386 或更高版本上的 4Gb 地址空间。
远指针有一个明确的选择器。但是,当您对它们进行指针运算时,选择器不会被修改。
巨大的指针有一个明确的选择器。当您对它们进行指针运算时,尽管选择器可以更改。