指针声明的一般语法:data-type *pointer_name;
指针是一个变量,其值是另一个变量的地址,即存储单元的直接地址。与任何变量或常量一样,必须先声明指针,然后才能使用它来存储任何变量地址。指针的数据类型必须与指针指向的变量相同。
为什么指针变量应该包含相同数据类型的变量的地址这一点很重要?
由于指针与另一个变量的值无关,为什么整数指针的浮点数据类型变量的地址是什么?
正确的表格:
int a = 10;
int * ptr =& a;
错误,类型不匹配
浮动a;
int * ptr; ptr =& a;
答案 0 :(得分:4)
在回答之前,让我问你,如果它有效,你会用这样的指针做什么?
假设您(在函数内)
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;
u.f = 3.14;
++u.i;
return u.f;
所以,回答:它是为了防止你在脚下射击自己。它是不允许的,因为这样的指针无法使用。 可以有用的一种情况实际上是它不起作用的情况,并且有另一种语言构造可以处理它,并正确处理它。
答案 1 :(得分:2)
因为当你增加像
这样的指针时ptr++;
它将指向一个与数据类型的大小相乘的地址。如果你这样做
ptr+=2;
并且数据类型占用4个字节,如果指针被声明为
,则会出现这种情况float *ptr;
指针将以8个字节的位置增加。
答案 2 :(得分:2)
这是一项安全功能。指向另一个变量的一种类型的指针是灾难的处方;它几乎没有合法的目的,几乎你用它做的任何事情都是危险的,特别是如果类型的大小不同。
您可以通过强制转换覆盖此功能。如果你这样做,你就不能再声称你不知道自己在做一些危险的事情。
答案 3 :(得分:2)
还有一个解除引用指针的简单问题。
something = * pointer;
取消引用指针时应读取多少数据?编译器必须知道数据类型才能对数据执行操作,如fetch,add等。
答案 4 :(得分:1)
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<float *>(p);
Void指针有局限性:你不能取消引用它们,也不能做任何指针运算。
1 :不应将函数指针强制转换为void *
。
答案 5 :(得分:0)
让我们用一个例子来理解它。
int main()
{
char i = 8;
int *ptr = &i;
printf("Value of i = %d", *ptr);
return 0;
}
Ans:它会打印一些垃圾,因为它在内存中取消引用了4个字节。
所以如果你做char *ptr = &i;
,它将取消引用1个字节,依此类推。
它会给出正确答案。