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

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

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

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

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

正确forms:

int a = 10;

int * ptr =&a;

错误,类型不匹配

漂浮一个;

int * ptr; ptr =&a;

因为当你增加指针时

 ptr++; 

它将指向一个与数据类型的大小相乘的地址。 如果你这样做

 ptr+=2; 

并且数据类型占用4个字节,如果指针被声明为则是这种情况

 float *ptr; 

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

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

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

 float a; int *ptr; ptr = &a; *p = 1; ++*p; return *p; 

在这种情况下,没有理由不使用int变量,如果它是你想要的int

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

 float a; int *ptr; ptr = &a; a = 3.14; ++*p; return a; 

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

如果后一种情况是你正在寻找的东西,你可以使用union ,它可以使你的代码更清晰地给其他读者,并使你的代码更清晰:

 union { float f; int i; } u; uf = 3.14; ++ui; return uf; 

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

这是一个安全function。 指向另一个变量的一种类型的指针是灾难的处方; 它几乎没有合法的目的,几乎你用它做的任何事情都是危险的,特别是如果类型不同的话。

您可以通过强制转换覆盖此function。 如果你这样做,你就不能再声称你不知道自己在做一些危险的事情了。

还有一个解除引用指针的简单问题。

某事= *指针;

指针解除引用后应读取多少数据? 编译器必须知道数据类型才能对数据执行操作,如fetch,add等。

指针可以指向任何数据类型:这正是void指针的用途。 您可以使用void *指向任何数据类型1 ,然后您可以返回原始指针。

 float f = 1.0f; int i = 12; void *p = &f; p = &i; 

当然,如果没有先将其转换回正确的指针类型,则无法取消引用void指针。 您可以确保指针类型正确。

 // In C, this is valid: implicit conversions to void * and back. float f = 1.0f; void *p = &f; float *fp = p; printf("*fp = %f\n", *fp); // In C++, you have to use a cast: float *fp = static_cast(p); 

无效指针有局限性:你不能取消引用它们,也不能做任何指针算术。

1 :函数指针不应转换为void *

让我们用一个例子来理解它。

 int main() { char i = 8; int *ptr = &i; printf("Value of i = %d", *ptr); return 0; } 

Ans:它会打印一些垃圾,因为它在内存中取消引用了4个字节。 所以,如果你做char *ptr = &i; ,它将取消引用1个字节,依此类推。它将给出正确的答案。