0

例如在我的 64 位 ubuntu 机器中,指针的长度是 2 字节并且有 1 个内存地址,那么它是否总是 2 字节,无论它指向的是 long int 还是 int 吗?

如果是这样,确定它指向的数据类型有什么意义?在下面的代码中,除了不兼容的警告目的之外,数据代表多少字节,通过使用%huand %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,它将跳过数据类型所具有的字节长度,而不是总是某个值

4

1 回答 1

1

我可能误解了您的要求,如果是,请提前接受我的道歉。我认为正在发生的事情是,您通常将指针概念与任何给定指针可能引用的类型的概念混淆了。

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

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

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

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

于 2012-09-19T02:31:04.037 回答