为什么指针的数据类型应该与它所寻址的变量的数据类型相同?

Why the datatype of the pointer should be same as the datatype of the variable to which it is addressing?

代码片段 1:

int main(){
   float fl;
   int *i=&fl;  
}

错误是:

error: cannot convert 'float*' to 'int*' in initialization int *i=&fl;

代码片段 2:

int main(){
   int i;
   float *fl=&i;  
}

错误是:

error: cannot convert 'int*' to 'float*' in initialization float *fl=&i;

问题

数据类型仅有助于将所需的内存大小分配给指定的数据类型。当涉及到内存地址时,无论变量的数据类型如何,两个地址都将采用相同的格式。

例如-

int a;
float b;
cout<<&a<<" "<<&b;

输出是_

0x61fe1c 0x61fe18

因此,通过查看地址,无法区分数据类型。那么在指针处理地址的时候,为什么不能给float变量赋一个整型指针呢?

注意:这里我不是在谈论数据类型的大小或每个数据类型占用的字节数或每个指令存储的数据格式。我只对变量的地址感兴趣。

当您取消引用指针时,它指向的数据类型必须为编译器所知,以便它正确地解释它在那里找到的数据。这就是指针被“类型化”的原因。

由于更改“类型”是一个先验错误,因此除非明确强制转换,否则不允许这样做。

The datatype only helps in allocating the required memory size to the specified datatype.

这不是真的。指针的类型 p 还告诉编译器要为表达式 *p.

使用什么类型

如果 pint *,则 *p 的类型为 int,并且如果程序使用 *p + 3 等表达式,编译器将生成一个整数加法指令(或等效代码)。如果 pfloat *,那么 *p 的类型是 float,并且如果程序使用 *p + 3 等表达式,编译器将生成 floating-point 添加指令(或等效代码)。这些不同的指令将导致计算机以不同方式处理 *p 的位。

When it comes to the address of the memory, irrespective of the datatype of the variable, both addresses will be in the same format.

这在 C 实现中通常是正确的,但并不总是正确的。 C 标准允许不同类型的指针具有不同的表示形式,但有某些例外。 (指向字符类型和 void 的指针必须彼此具有相同的表示。指向结构类型的指针必须彼此具有相同的表示。指向联合类型的指针必须彼此具有相同的表示。)