为什么变量指针包含相同数据类型的地址?

Mub*_*mon 2 c c++ memory pointers memory-address

指针声明的一般语法: data-type *pointer_name;

指针是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量一样,您必须先声明一个指针,然后才能使用它来存储任何变量地址。指针的数据类型必须与指针指向的变量相同。

为什么指针变量应该包含相同数据类型的变量的地址很重要?

由于指针与另一个变量的值无关,为什么整数指针不能具有浮点数据类型变量的地址?

正确的形式:

整数 a = 10 ;

int *ptr = &a ;

错误,类型不匹配

浮动一个;

int *ptr; ptr = &a;

And*_*dén 5

因为当你增加一个指针时

ptr++;
Run Code Online (Sandbox Code Playgroud)

它将指向一个地址,该地址是数据类型大小的一倍。如果你这样做

ptr+=2;
Run Code Online (Sandbox Code Playgroud)

并且数据类型占用 4 个字节,如果指针声明为

float *ptr;
Run Code Online (Sandbox Code Playgroud)

指针将增加 8 个字节位置。


小智 5

在回答这个问题之前,让我问你,如果它有效,你会用这样的指针做什么?

假设你有(在一个函数内)

float a;
int *ptr; ptr = &a;

*p = 1;
++*p;
return *p;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,完全没有理由不使用int变量(如果它是int您想要的)。

假设你有(在一个函数内)

float a;
int *ptr; ptr = &a;

a = 3.14;
++*p;
return a;
Run Code Online (Sandbox Code Playgroud)

在这种对象别名中,可以使用,但允许这样的构造对编译器来说是一种痛苦。编译器可以自由地假设,有些人确实假设, 的修改*p对 的值没有影响a,所以仍然返回 3.14 未修改;

如果您正在寻找后一种情况,您可以使用union,这既使您的代码对其他读者更清晰,并使您的代码对编译器更清晰:

union {
  float f;
  int i;
} u;
u.f = 3.14;
++u.i;
return u.f;
Run Code Online (Sandbox Code Playgroud)

所以,回答:这是为了防止你用脚射击自己。这是不允许的,因为这样的指针没有任何用处。它可能有用的一种情况实际上是它不起作用的情况,并且有另一种语言结构可以处理它并正确处理它。