例如在我的64位ubuntu机器中,指针的长度是2个字节并且有1个内存地址,所以它总是2个字节,无论这么长的int或int它是pointe吗?
如果是这样,确定它所指向的数据类型的重点是什么?在下面的代码中,除了不兼容的警告目的,使用%hu
和%lu
表示数据表示的字节数,因此无论指针是int还是long,结果都是相同的。谁能给我一个暗示?
#include <stdio.h>
int main(void) {
int *ptr1;
long int *ptr2;
long int a = 0xffffffff;
ptr1 = &a;
ptr2 = &a;
printf("the value should the same as 2 ** 16 %hu", *ptr1);
printf("the value should the same as 2 ** 32 %lu", *ptr2);
return 0;
}
更新
确定我能想到的指针类型的另一个目的是指针运算,如:
ptr + 1
,它将跳过数据类型的字节长度,而不是一定的值
答案 0 :(得分:1)
我可能会误解你的要求,如果是的话,请提前接受我的道歉。我认为发生的事情是你将指针一般的概念与任何给定指针可能引用的 type 的概念混淆在一起。
指针,无论它指向哪个,它只是内存中的一个地址(但是它是针对给定的环境或系统而构建的)。被引用的数据类型在分配(malloc,calloc等)中至关重要,因为确实变得非常重要,因为知道需要为一个内存分配多少字节给定指针引用的特定类型/结构。如果您正在使用指向数组结构的指针,那么如果增加指针引用,数据大小就变得更加重要,因为指针增量可以增加所引用数据的大小。
您可以声明指针类型,但它不会分配任何内容。您收到的警告是编译器告诉您它看到您有意或无意地获取某种类型变量的地址但是冒着尝试将其用作不同地址的风险的方式善变的。
假设一个int占用四个字节,但一个short int需要两个字节。如果你把一个指针指向一个short int,但是给它写一个int值,你就会腐败谁知道一路走来的路。这正是为什么跟踪你引用的指针类型很重要的原因,以免你的代码在运行时发生真正的错误。
正如我所说,我可能误解了这个问题,如果是的话,请接受我的道歉。我希望这有用。