我正在通过阅读K& R并进行练习来学习c。我现在在第5章处理指针。我不明白为什么声明:
int *p;
不是:
long int *p;
因为* p包含一个地址,并且不能保证int类型的变量足够大以容纳一个大地址。或者有吗?
答案 0 :(得分:8)
int是指针指向的对象的类型,而不是指针本身的大小。指针的大小与它指向的对象无关
例如:
int *p;
double *d;
pointers
p和d“通常”具有相同的大小,但它们指向的数据大小不同。
编辑:正如评论中指出的那样,指针实际上并不“必须”具有相同的大小。
约翰解释说:
例如,一个char *在字寻址系统上实际上可能比int *大, 因为它需要指定一个偏移量 进入这个词。唯一的保证是 void *和char *具有相同的 对齐和表示,那 指向兼容类型的指针有 相同的对齐和表示, 指向struct类型的指针有 相同的对齐和表示,以及 指向联合类型的指针都有 相同的对齐和表示
答案 1 :(得分:3)
long int *
表示指向long int
它并不意味着长指针。
指针是单独的东西,将有自己的大小。 (取决于你正在编译的位数)
答案 2 :(得分:1)
int *
不属于int
类型。它是一种指针类型。因此它足够大以存储任何地址。 long int *
与int *
的大小相同 - 只是因为你正在处理事物的不同之处。
答案 3 :(得分:1)
这是一个指向int的指针(我倾向于写为'int * p')。这基本上意味着p是指向int的指针。
第二个是指向long int的指针。
它们都是指针,因此存储的字节数相同,但一个引用一个int,另一个引用long int。
答案 4 :(得分:0)
不要将指针的类型与指向的类型混淆。 表达式 *p
的类型为int
,但p
的类型为int *
。