int *p应该改为long int *p吗?

5

我正在通过阅读K&R并完成习题来学习C语言。现在我正在学习第五章,该章节涉及指针。我不理解以下语句的原因:

int *p;

不是:

long int *p;

因为*p包含一个地址,而且不能保证int类型的变量足够大来容纳一个大地址。但是有没有办法呢?

5个回答

8

int是指针所指对象的类型,而不是指针本身的大小。指针的大小与其所指向的对象无关。

例如:

int *p;

double *d;

指针p和d“通常”具有相同的大小,但它们指向的数据大小不同。

编辑:正如评论中指出的那样,指针实际上并非“必须”具有相同的大小。

正如John所解释的:

例如,在一个字寻址系统上,char*实际上可能比int*大,因为它需要指定一个偏移量。唯一的保证是void*和char*具有相同的对齐方式和表示形式,指向兼容类型的指针具有相同的对齐方式和表示形式,指向结构类型的指针具有相同的对齐方式和表示形式,而指向联合类型的指针都具有相同的对齐方式和表示形式。


2
指向 doubleint 的指针不必具有相同的大小。 - Carl Norum
1
@Carl 嗯,我认为应该。在特定系统上,指针的大小不是一致的吗? - Pepe
1
@Peter:不一定。例如,在一个字地址系统上,char * 可能比 int * 更大,因为它需要指定一个偏移量到字中。唯一的保证是 void *char * 具有相同的对齐和表示方式,指向兼容类型的指针具有相同的对齐和表示方式,指向struct类型的指针具有相同的对齐和表示方式,指向union类型的指针都具有相同的对齐和表示方式。 - John Bode
@David 我不确定“required”部分是否百分之百正确,但我认为它们至少在大多数现代系统上需要保持一致... - Pepe
POSIX 似乎还要求所有指针类型具有相同的大小/表示(如果不是这样,它至少要求 void * 和函数指针具有相同的表示)。 - R.. GitHub STOP HELPING ICE
显示剩余6条评论

3

long int *表示指向long int的指针。
它并不意味着一个长指针。

指针是独立的东西,将有自己的大小。(取决于你编译的位数)


1

int * 不是 int 类型。它是一个指针类型。因此,它将足够大以存储任何地址。long int *int * 大小相同 -- 只是您将指向的位置视为不同而已。


1

这是一个指向 int 的指针(我倾向于写成 'int* p')。这基本上意味着 p 是一个指向 int 的指针。

第二个是指向 long int 的指针。

它们都是指针,因此存储的字节数相同,但一个引用 int,另一个引用 long int。


0
不要混淆指针的类型和它所指向的类型。表达式 *p 的类型是 int,但 p 的类型是 int*。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接