【问题标题】:Why is the data type needed in pointer declarations?为什么指针声明中需要数据类型?
【发布时间】:2026-02-23 01:45:01
【问题描述】:

据我所知,C/C++中的数据类型,在声明一个变量的同时,我们需要声明它的数据类型,这告诉编译器相应地保留内存中的字节数。

但在指针的情况下,我们知道它们的大小是恒定的(例如“Turbo Compiler”中的 2 个字节),而与它所指向的变量的数据类型无关,因为指针将内存地址存储为无符号整数。

我的问题是,如果指针 总是 以字节为单位的常量大小,那么在声明它们时需要提及 数据类型 吗?我对指针的理解是不是错了?

【问题讨论】:

  • 指定数据类型有什么意义?如果你打算对指针做任何事情,那么你需要知道它指向的数据类型。
  • @Chandra : (void *) 怎么样?
  • @tenfour 您可能希望对指针的目的地执行相同类型的操作,而不管其类型如何

标签: c++ c pointers


【解决方案1】:

取消引用指针时需要数据类型,以便知道应该读取多少数据。例如,取消引用 char 指针应该从它指向的地址读取下一个字节,而 int 指针应该读取 2 个字节。

【讨论】:

  • 这是一个很好的答案!我终于明白了。
  • 简单而直观的解释。
【解决方案2】:

在两种情况下需要指针的数据类型:

  1. 延迟指针
  2. 指针算法

取消引用指针中如何使用它?
考虑以下示例:

    {
        char *k; //poniter of type char
        short j=256;
        k=&j;    // Obviously You have to ignore the warnings
        printf("%d",*k)
    }

现在因为 k 是 char 类型,所以它只会读取一个字节。现在 256 的二进制值是 0000000100000000 但因为 k 的类型是 char 所以它只会读取第一个字节因此输出将为 0。
注意:如果我们分配 j =127 那么输出将是 127,因为 127 将被第一个字节保存。

现在来指针运算
考虑以下示例:

    {
        short *ptr;
        short k=0;
        ptr=&k;
        k++;
        ptr++;// pointer arithmetic
    }

语句k++ptr++ 是同一个东西吗?不,k++ 表示 k=k+1ptr++ 表示 ptr=ptr+2。因为编译器“知道”这是一个指针并且它指向一个短整数,所以它将 2 加到 ptr 而不是 1,所以指针“指向”下一个整数。

更多信息请参考this教程第二章。

【讨论】:

    【解决方案3】:

    首先是指针本身的大小和表示aren't always the same for different types。这只是在许多实现中发生的事情。

    其次,当使用指针时,你并不关心指针本身的大小。您需要尖字体的大小

    例如,试试这个:

    int var[5];
    char *c = (char *)var;
    int  *x = var;
    
    printf("%p\n%p\n", p + 1, x + 1);
    

    您会看到指针算法很大程度上取决于指向类型的大小。

    【讨论】:

      【解决方案4】:

      问题不在于指针大小,而在于指针取消引用。 (无论是 C 还是 C++)

      假设你有:

      int* someint;
      float* somefloat;
      

      *someint 引用的内存大小为sizeof(int),而*somefloat 引用的内存大小为sizeof(float),两者是不同的。

      【讨论】:

        【解决方案5】:

        指针所需的大小取决于您使用的系统。在x86_64 系统上,指针大小可能为 64 位。

        您需要指针数据类型的原因是因为编译器必须知道内存单元的大小,其中包括指针所指向的。没有类型也无法确保类型安全。此外,从指针访问结构时,您必须对每个指针进行类型转换。

        您也可以使用void 指针并手动完成所有操作。但是你为什么要这样呢?

        【讨论】:

          【解决方案6】:

          假设这段代码编译没有错误(如你所愿):

          int a;
          int b = 42;
          void * d = &b;
          
          a = *d;
          

          a 的值应该是多少?

          现在有了这个:

          int a;
          float b = 42.0;
          void * d = &b;
          
          a = *d;
          

          你期待什么?

          实际上类型指定了应该如何解释指向的区域。您应该在第一个示例中指定int *,在第二个示例中指定float *,而不是void *

          【讨论】:

            【解决方案7】:

            类型检查只需要数据类型。

            【讨论】:

            • 一般来说,尽量给出更实质性的答案。也许试着举个例子?
            【解决方案8】:

            它是 C++ 中使用的强类型的概念。指针的大小可能相同,但指向类型的大小可能不同。但是,您始终可以将一种类型的指针转​​换为另一种类型的指针。

            【讨论】:

              最近更新 更多