【C语言】结构体包含指向自己的指针

来源:互联网 发布:浏览器代理软件自动 编辑:程序博客网 时间:2024/06/04 00:30
转自:http://flashcs3.blog.163.com/blog/static/1997203142013297569964/
问题1:两种声明有什么不同?

struct x1 {...};
typedef struct {...} x2;
答:第一种形式声明了一个结构标签,第二种声明了一个“类型定义”。主要区别在于第二种声明更抽象一些,用户不必知道它是一个结构,且在声明它的实例时也不需要使用struct关键字。例如:
x2 b;//是OK的
但是使用结构标签声明的结构就必须用这样的形式定义:
struct x1 a;
也可以同时使用
typedef struct x3 {...} x3;
尽管有些晦涩,但为标签和类型定义使用同样的名称是合法的,因为它们处于独立的命名空间中。

问题2:结构体可以包含自己的指针吗?
当然可以,但是如果要使用typedef,则有可能产生问题。
例如:
typedef struct{
    char *item;
    NODEPTR next;//错误,不能在定义typedef类型之前使用它
}*NODEPTR;
版本1:
typedef struct node {
    char *item;
    struct node *next;
}*NODEPTR;
版本2:
struct node {
    char *item;
    struct node *next;
};
typedef struct node *NODEPTR;

结构体可以包含指向自己的指针吗?结构标签(struct tag)与类型定义(typedef) - myswirl - MY BLOG

运行环境:VC6.0
例子程序:tets.c
*************************************************************************************************
#include <stdio.h>

struct x1 //x1为结构标签
{
    int a;
    int b;
};
typedef struct 
{
    int c;
    int d;
}tx;    //tx为类型定义

typedef struct node
{
    char item;
    struct node *next;    //结构体中定义指向自己的指针
}NODEPTR;

/*
typedef struct node
{
    char *item;
    NODEPTR next;    //不可以,不能在typedef类型之前使用它
}*NODEPTR;
*/
void main(void)
{
    struct x1 s1;    //不能用结构标签自动生成类型定义名: x1 s1
    tx s2;
    NODEPTR node1;
    NODEPTR node2;
    node1.next = &node2;

    s1.a = 1;
    s1.b = 2;
    s2.c = 3;
    s2.d = 4;
    node1.item = 'x';
    node2.item = 'y';
    printf("s1.a:%d, s1.b:%d \n",s1.a,s1.b);
    printf("s2.c:%d, s2.d:%d \n",s2.c,s2.d);
    printf("%c, %c \n",node1.item, node2.item);

}
0 0
原创粉丝点击