C int*p应该改为长int*p吗?

C int*p应该改为长int*p吗?,c,C,我通过阅读K&R和做练习来学习c。我现在在第五章讨论指针。我不明白为什么这样说: int *p; 不是: long int *p; 因为*p包含一个地址,所以不能保证int类型的变量足够大以容纳一个大地址。还是有?int*不是int类型。它是指针类型。因此,它将足够大,可以存储任何地址long int*的大小与int*的大小相同——只是您将指向的对象视为不同。int是指针指向的对象的类型,而不是指针本身的大小。指针的大小与它指向的对象无关 例如: int *p; double *d; 指

我通过阅读K&R和做练习来学习c。我现在在第五章讨论指针。我不明白为什么这样说:

int *p;
不是:

long int *p;

因为*p包含一个地址,所以不能保证int类型的变量足够大以容纳一个大地址。还是有?

int*
不是
int
类型。它是指针类型。因此,它将足够大,可以存储任何地址
long int*
的大小与
int*
的大小相同——只是您将指向的对象视为不同。

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

例如:

int *p;

double *d;
指针
p和d“通常”大小相同,但它们指向的数据大小不同

编辑:正如注释中指出的,指针实际上并不“需要”具有相同的大小

正如约翰所解释的:

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


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


指针是独立的东西,它们有自己的大小。(取决于编译的比特数)

这是指向int的指针(我倾向于写为“int*p”)。这基本上意味着p是指向int的指针

第二个是指向长整型的指针


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

不要将指针的类型与其指向的类型混淆。表达式
*p
的类型是
int
,但是
p
的类型是
int*

指向
double
int
的指针不必具有相同的大小。@Carl-hmm,我认为它们应该具有相同的大小。指针的大小在给定系统上不一致吗?Thx Peter。我想编译器知道根据编译器选项生成*p的大小。@Peter:在给定系统上,数据指针大小通常是一致的。我不认为它们是必需的,我可以想到一些架构(不再经常使用),其中指针大小可能会根据指针指向的对象而有所不同。@Peter:不一定。例如,字寻址系统上的
char*
实际上可能比
int*
大,因为它需要在字中指定偏移量。唯一的保证是
void*
char*
具有相同的对齐和表示,指向兼容类型的指针具有相同的对齐和表示,指向
struct
类型的指针具有相同的对齐和表示,指向
union
类型的指针都具有相同的对齐方式和表示方式。