为什么指针声明中需要数据类型?

Cha*_*har 25 c c++ pointers

据我所知的数据类型,在声明变量时,我们需要声明其数据类型,它告诉编译器相应地保留内存中的字节数.

但是在指针的情况下,我们知道它们的大小总是2个字节(在Turbo编译器中)总是它所指向的变量数据类型无关.

我的问题是,如果指针总是占用2个字节,那么在声明它们时需要提一下数据类型吗?或者我对指针的理解是错误的?

gli*_*ste 40

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

  • 这是一个很好的答案!我终于明白了这一点。 (2认同)
  • 简单而直观的解释。 (2认同)

A.s*_*lar 10

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

  1. 引用指针
  2. 指针算术

如何在解除引用指针时使用它?
请考虑以下示例:

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

现在因为k是类型char所以它只读取一个字节.现在二进制值2560000000100000000因为k是类型char所以它只读取第一个字节,因此输出将为0.
注意:如果我们分配j = 127,那么输出将是127,因为127将由第一个字节保持.

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

    {
        short *ptr;
        short k=0;
        ptr=&k;
        k++;
        ptr++;// pointer arithmetic
    }
Run Code Online (Sandbox Code Playgroud)

是报表k++ptr++是一回事吗?不,k++手段k=k+1ptr++手段ptr=ptr+2.因为编译器"知道"这是一个指针而且它指向一个short,它将2加到ptr而不是1,所以指针"指向"下一个整数.

有关更多信息,请参阅教程的第二章.


cni*_*tar 6

首先,对于不同类型,指针本身的大小和表示并不总是相同.这只是许多实现中发生的事情.

其次,当使用指针时,你不关心指针本身的大小.您需要指向类型的大小.

例如,试试这个:

int var[5];
char *c = (char *)var;
int  *x = var;

printf("%p\n%p\n", p + 1, x + 1);
Run Code Online (Sandbox Code Playgroud)

你会看到指针运算强烈依赖于指向类型的大小.


dwe*_*ves 5

问题不在于指针大小,而是指针解除引用.(在C或C++中)

说你有:

int* someint;
float* somefloat;
Run Code Online (Sandbox Code Playgroud)

*someint引用内存大小sizeof(int),而*somefloat引用的内存大小sizeof(float)不同.