指针声明的一般语法: data-type *pointer_name;
指针是一个变量,其值是另一个变量的地址,即存储位置的直接地址。 如同任何变量或常量,必须声明指针之前,你可以用它来存储任何变量的地址。 指针的数据类型必须是相同的变量,其中指针指向。
为什么很重要的是一个指针变量应包含相同的数据类型的变量的地址?
作为指针无关与另一个变量的值,为什么不能整型指针具有浮点数据类型变量的地址?
正确形式:
INT A = 10;
INT * PTR =&一个;
ERROR,类型不匹配
浮起;
INT * PTR; PTR =&一个;
因为当你增加像是指针
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;
u.f = 3.14;
++u.i;
return u.f;
因此,要回答:这是为了防止你的脚搬起石头砸自己。 这是不允许的,因为没有办法这样的指针是非常有用的。 在一个情况下它可能是有用的其实是它不工作的情况下,还有另外一个语言结构做处理它,并正确处理它。
这是一项安全功能。 一种类型的指点到另一个可变指针是一个灾难; 它几乎没有任何合法的目的和几乎所有的东西你用它做是很危险的,尤其是如果该类型是不同的尺寸。
您可以通过铸造方法取代此功能。 如果你这样做,你就不能说你不知道你正在做一些危险的。
还有解引用指针的简单的事情。
东西= *指针;
当指针被废弃多少数据应该读? 编译器必须知道数据类型,以像获取的数据进行操作,添加等。
这是可能的指针指向任何数据类型:这正是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);
空指针有局限性:不能解引用他们,你不能做任何指针运算。
1:函数指针不应该被强制转换为void *
。
让我们用一个例子了解它。
int main()
{
char i = 8;
int *ptr = &i;
printf("Value of i = %d", *ptr);
return 0;
}
答:它会打印一些垃圾,因为它解除引用在内存中4个字节。 所以,如果你做的char *ptr = &i;
,这将间接引用1个字节等..它会给正确的答案。