有和没有结构的指针声明?

时间:2015-06-13 08:30:07

标签: c++ struct linked-list

之间的区别是什么:

  struct name{
    int example;
    name *next;
    };

struct name *next= NULL;

...和

name *next=NULL;`

(在数据结构之后定义,当链表仍为空时) ?

2 个答案:

答案 0 :(得分:2)

  

“......之间有什么区别”

没有。 structclass关键字在指针声明中是可选的。

答案 1 :(得分:1)

首先,结构中名称为next的数据成员

struct name
{
    int example;
    name *next;
};

和在结构之后声明的具有相同名称的变量,例如

struct name *next = NULL;

是两个不同的实体。

最后一个声明不会将结构的任何对象的数据成员初始化为NULL。它声明了一个指向结构类型对象的指针。

现在谈谈两个声明之间的区别

struct name *next = NULL;

name *next = NULL;

在第一个中使用了所谓的详细类型名称struct name。与第二个声明相比,它的优点是任何对象,枚举器或以同名name声明的函数都隐藏了结构的声明。例如

struct name
{
    int example;
    name *next;
};

enum { name, noname };

此枚举器name隐藏数据类型struct name,如果您编写例如

name *next = NULL;

然后编译器将发出错误。

但是如果你将使用精心设计的名字

struct name *next = NULL;

然后代码编译成功,因为编译器现在知道此声明中的namestruct name

另一个重要区别。

请考虑以下代码段

int main()
{
    struct name
    {
        int example;
        name *next;
    };

    {
        name *next = NULL;
    }
}

在这个程序中,内部代码块中的声明声明了一个在外部代码块中声明的结构类型的指针。

现在重写程序

int main()
{
    struct name
    {
        int example;
        name *next;
    };

    {
        struct name *next = NULL;
    }
}

在这种情况下,内部代码块中的声明引入了新类型 struct name隐藏外部代码块中的结构声明。