我对C ++比较陌生,我正在尝试使用 - >结构。我有这个代码,应该从结构中打印出名称和年龄。我知道 - >当变量是一个指针时使用,所以我试图用以下代码声明一个指向结构的指针:
typedef struct Person{
string name;
int age;
};
int main() {
Person me;
me.name = "name";
me.age = 1;
Person* me2;
*me2 = me;
cout << me2->name << "," << me2->age << endl;
return 0;
}
此代码导致分段错误。
但是,如果我改变
*me2 = me
到
me2 = &me
代码工作正常(打印出姓名和年龄)。
我不确定为什么这两行代码不相同。我以为我被允许用*更改指针的内容,但我不确定为什么这不起作用。有人能帮我理解吗?
答案 0 :(得分:7)
不同之处在于,*me2 = me
行将me
的内容复制到me2
个点中。默认情况下,me2
不指向任何内容,这会产生未定义的行为(在您的情况下,它会导致段错误。)
但是,行me2 = &me
会将me
的地址复制到me2
,而不会取消引用无效指针。实际上,这使得me2
指向一个有效的内存块(因为它指向me
),因此是正确的行为。
答案 1 :(得分:0)
您需要了解在C ++中,星号(*
)可能具有不同的含义,具体取决于使用它的上下文。
在一种情况下,*
用于声明一个指向某事物类型的变量。当您在声明的变量名称左侧看到*
时,这意味着什么。例如:
Person* me;
在这里,您要声明一个名为me
的变量 - *
位于其左侧,并且是me
的类型名称的一部分。换句话说,me
是指针类型的变量 - Person
在另一种情况下,*
用于取消引用指针。要“取消引用”指针意味着跟随指针并获取它指向的值。如果*
未用作typename的一部分,那么它将在此上下文中使用。一个例子是:
me = *pointerToOtherPerson;
此处,pointerToOtherPerson
是(假设为)指针类型 - Person
。所以这里发生的事情是pointerToOtherPerson
被解除引用 - 指针被跟随到实际的Person
对象,并且该对象通过me
赋值被复制到=
。
相关操作是取一些东西的地址。这是通过addressof-operator &
完成的。这是一个例子:
me2 = &me;
此处,me2
是指针,me
是Person
对象(不是指针)。通过将&
应用于me
,您可以获取me
的地址,并通过me2
将该地址分配给=
。
答案 2 :(得分:0)
typedef struct Person{
string name;
int age;
};
这显然是在C ++中应用C-ism的尝试。不要那样做。在C ++中定义此结构的正确方法是:
struct Person{
string name;
int age;
};
现在,关于代码的其余代码......
Person me;
me.name = "name";
me.age = 1;
Person* me2;
这会创建一个指向Person
的指针,指针的名称为me2
。但是,您没有指定它应该指向的内容!这里的其他人说它相当于一个空指针。这是错误。其目标未指定,任何取消引用它的尝试都将是未定义的行为。
因此,以下行会产生麻烦:
*me2 = me;
我们走了。通过编写*me
,您试图获得对未定义的内容的引用。未定义的行为意味着允许程序崩溃。
接下来发生的事情是无关紧要的。此时,未定义的行为已经“破坏”了您的程序。
me2 = &me
这是不同的。您不取消引用me2
指针,但为其指定一个定义的值,即me
的地址。
我以为我被允许更改指针的内容 *
取决于“指针内容”的含义。在指针前加上*
,您只需获得指针所指向的引用。如果它指向什么或没有定义的东西,那么行为是未定义的,可能会发生崩溃。