我正在寻找关于指针的澄清。我在bordland c ++ 5.5.1中编译了以下代码,没有任何错误。但是,当我尝试执行时会出现核心错误。
int main ()
{
int x=10,y=20;
int &a=x;
int &b=y;
int *c;
int *d;
*c=x;
*d=y;
return 0;
}
基本上我试图创建两个引用变量(a,b)并分配两个变量(x,y)。之后我创建了两个指针变量(c,d)并尝试分配相同的变量(x,y)。这给了我错误的执行而不是编译。
我是否做错了,这不是指针变量的标准赋值。为什么指针赋值在此时失败了。请帮我理解这一点。
第一次更新:
感谢所有人。首先,我了解到我正在研究C ++特性(引用变量)。 其次,我需要在使用之前为指针变量分配内存。
答案 0 :(得分:7)
你发布的代码是C ++,而不是C.你的问题是你需要让这些指针实际指向某些东西:
int * c = & x; // make c point at x
* c = 42; // changes x
答案 1 :(得分:2)
你已经将c和d声明为int指针,并且你试图更新它们的指向值,它们并没有指向任何有效的地方,因为你从未用有效的内存初始化它们。
尝试c =& x;然后玩c。
答案 2 :(得分:2)
您正在取消引用无效指针。 “c”和“d”未分配内存位置,因此将使用以前在内存中的任何内容作为其位置。你需要这样做:
int *c = new int;
int *d = new int;
答案 3 :(得分:2)
在我看来,你并不完全清楚语法。
键入int *c
很棘手,因为它看起来像是在声明一个名为*c
的整数。然而,这种情况并非如此。这将声明一个指向整数的指针,在C / C ++中,通过在类型名称后附加*
来表示指向某个类型的指针。因此,您将声明一个类型为int*
的变量(指向整数的指针),名称为c
,即使间距使其看起来不同。对于记录,键入int* c
会产生相同的结果,并且可以说更具可读性。
然后,键入*c
不会引用您的变量,因为它实际上称为c
。相反,它的作用是取消引用指针:它返回指针指向的任何对象。或者,如果指针无效,则会导致错误。
如果要声明指针并将其设置为稍后指向某个对象,则需要执行以下操作:
int *c;
// stuff goes here
c = &x;
&x
将在内存中返回x
的地址,该地址可以作为值分配给指针。然后,您可以通过解除引用来操纵指针的值:例如, *c = 15
。
答案 4 :(得分:0)
您已经定义了两个指针变量c和d但是没有为它们分配任何内存。你需要为它们分配一些内存。
这样做:
int *c = &x;
int *d = &y;