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

Pointer declaration with and without struct?

有什么区别:

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

struct name *next= NULL;

...和

name *next=NULL;`

(定义在数据结构之后,链表还是空的时候) ?

"What's the difference between ..."

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

首先是结构

中名称为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 将结构声明隐藏在外部代码块中。