Pointers 指针是否总是具有相同的长度,并且有1个内存地址,而不考虑它指向的数据类型?

Pointers 指针是否总是具有相同的长度,并且有1个内存地址,而不考虑它指向的数据类型?,pointers,Pointers,例如,在我的64位ubuntu机器中,指针的长度是2字节,有1个内存地址,所以它总是2字节,不管它指向的是这么长的int还是int 如果是这样,那么确定它指向的数据类型有什么意义?在下面的代码中,除了不兼容的警告目的外,数据用%hu和%lu表示多少字节,因此无论指针是int还是long,结果都是相同的。谁能给我一个提示吗 #include <stdio.h> int main(void) { int *ptr1; long int *ptr2; long in

例如,在我的64位ubuntu机器中,指针的长度是2字节,有1个内存地址,所以它总是2字节,不管它指向的是这么长的int还是int

如果是这样,那么确定它指向的数据类型有什么意义?在下面的代码中,除了不兼容的警告目的外,数据用
%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;
}
#包括
内部主(空){
int*ptr1;
长整数*ptr2;
长整数a=0xffffffff;
ptr1=&a;
ptr2=&a;
printf(“该值应与2**16%hu相同,*ptr1);
printf(“该值应与2**32%lu相同,*ptr2);
返回0;
}

更新:

确定我能想到的指针类型的另一个目的是指针算法,如:


ptr+1
,它将跳过数据类型的字节长度,而不是总是某些值

我可能误解了您的要求,如果是,请提前接受我的道歉。我认为现在的情况是,你把指针的概念和任何给定指针可能引用的类型的概念混淆了

指针,不管它指向什么东西,都只是内存中的一个地址(不管它是为给定的环境或系统构造的)。被引用的数据类型在分配(malloc、calloc等)中至关重要,因为知道需要为给定指针引用的特定类型/结构分配多少字节的内存非常重要。如果使用指向数组结构的指针,那么如果增加指针引用,数据大小将变得更加重要,因为指针增量可以增加被引用数据的大小

您可以声明指针类型,但它不分配任何内容。您收到的警告是编译器告诉您,它看到您有意或无意地获取了一种类型变量的地址,但却冒着试图将其用作另一种类型变量的地址的风险

假设一个int需要四个字节,但是一个短int需要两个字节。如果你把一个指针指向一个短的int,但是给它写了一个int值,你会破坏谁知道在这个过程中发生了什么。这正是为什么跟踪所引用的指针类型很重要,以免在运行时代码发生真正糟糕的事情


正如我所说,我可能误解了这个问题,如果我误解了,请接受我的道歉。我希望这会有所帮助。

好的指针算法足以确保您的类型不是任意的。在C++中,如果没有合适的指针类型,你可能会遇到大量的运行时错误,这些错误应该是编译错误。@学徒戴维谢谢你让我知道,谢谢你,你确实消除了我的困惑。原因是定义指针的类型是为了方便操作指针,就像您所说的数组结构中的一样!很高兴我能帮忙!