为什么变量指针包含相同数据类型的地址?
指针声明的一般语法: 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个字节,依此类推。它将给出正确的答案。