C语言 指针 结构体的疑问

1:typedef char DdataTpye;
2:typedef struct node
{
3: Datatype data;
4: struct node * next;
5:}ListNode,*list_p;
6:Typedef ListNode *LinkList;

我有如下问题
第一行 表示定义一个新的类型DdataTpye 以后凡是出现DdataTpye 就表示为char
我有点想不通 为什么不用char表示,这样表示更方便。
第二行 表示定义一个结构体 名字为node 前面加个typedef目的是什么
第三行 表示定义了一个类型为Datatype的变量data
第四行 定义了一个node型的指针 指针名叫next,这里的node就是第二行定义的结构体
有人说是结构体嵌套 但是我的疑问是 结构体的成员可能是int型 也可能是float型
指向结构体的指针可以指向不同类型吗
第五行 ListNode也是类型不是变量名 原因是前面加了typede 具体是为什么我也不清楚
死记硬背罢了 要有人能告诉我 感谢啊
第六行 我的理解是定义了一个新的类型*LinkList即是Listnode结构体 以后遇到*LinkList
就表示指向Listnode结构体

以上不知道是否正确 还请高手指点

1. typedef就是为了类型换个名称,在程序中通常是为了统一变量类型定义。举个例子来说,字符型有普通的字符char和宽字符(通常用于
unicode)wchar_t,如果写了一个程序,希望能够自动的在char和wchar_t之间转换,那么我们可以这样来定义一个新的类型:
#ifdef UNICODE
typedef wchar_t TCHAR
#else
typedef char TCHAR
#endif
那么我们在定义变量的时候,就可以定义为:
TCHAR mych;
这样只要我们预定义了宏UNICODE的时候,mych就是wchar_t类型的变量;否则就是char类型的变量,可以很容易的进行切换,而不需要在代码中全文搜索,把所有的char和wchar_t进行替换了。

2. 前面说过typedef就是为了给类型换个名字,在结构体或者枚举类型的时候可以让程序更加简洁。
比如你这里的结构体node,如果我们想要定义一个node类型的变量,那么需要怎么定义?如果没有typedef的话,那么需要这样:
struct node MyNode; /*这里struct关键字不能省略,这样才表明了node是一个struct结构体类型,所以很麻烦*/
而现在已经把struct node通过typedef换了个别名ListNode,在定义变量的时候就可以直接:
ListNode MyNode;
这样来定义了,是不是比上面看上去清爽些?

3. 你说得对

4. 这就是一个指向结构体的指针,而不是嵌套结构。嵌套结构需要成员也是一个结构体,而这里不是,仅仅是一个指针而已。这种定义方法通常是为了构造一个链表,用这个指针来指向下一个元素。这里需要注意的是一定要定义成指针,你不能像这样来定义:
typedef struct node
{
Datatype data;
struct node next;
}ListNode,*list_p;
这是因为在编译到这一步的时刻,struct node还没有能够完全定义,所以编译器无法得知struct node的size是多少,自然也就无法正确的编译下去。所以只能定义为指针,而指针的大小是固定的(在32位系统来说就是占32位)。因为这个指针的类型就是一个指向node结构体的指针,所以我不太明白你说的“可以指向不同类型吗”是什么意思?刚刚有提到所有指针实际上都是一个32位的数据,所以如果你一定要指向不同类型的变量当然也可以,强制类型转换而已,只是我想不到什么样的使用场景需要你这样做?就看你想要怎么来使用他了。通常如果一个指针需要在不同情况下指向不同类型的话,你可以定义为void *。

5. 参考第二个问题的说明

6. 是的,就是定义了一个新的类型,这种类型是一个指针。比如你要定义一个链表,你可以定义为:
ListNode *myList;
现在因为定义了类型指针,你也可以定义为:
LinkList myList;
注意两种定义方法的区别是在变量名称前是否需要加*。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-12

    首先指出你说错了:不是“新的”类型,而只是为“已有”的类型char起一个“别名”,就是说以后用char和用DdataTpye效果是完全一样的。为什么要这么做?一句话,写代码是有风格之说的,就是说有人喜欢那样而不喜欢这样;有人连{}都被用begain和end代替了,你说哪个方便?

    不是问题1前面也有吗?它就是用来为这个结构体起“别名”的,它给结构体node模板起了两个别名,一个是对象别名ListNode,另一个是指针别名list_p。以后若要声明node的对象或指针a和pa,写ListNode a;和list_p pa;就可以了,而不必写成struct node a;和struct node *pa;了。当然写后者也是正确的。

    理解正确。且就是char data;。

    指向结构体的指针就是指向结构体的指针,结构体内部的变量结构无论多复杂,它的指针都包含这些信息。要注意,结构体指针是指向结构体整体的,不是指向其中某一变量的,访问是要用“结构体指针->就是名”形式才能操作到具体的变量。

    你说对了,因为前面有typedef,所以ListNode成了struct node的别名,而不是struct node的变量;若没有typedef,ListNode就是变量了……这没有办法,C的语法规定,只好记住了,没有什么“理论根据”。

    不是定义了一个新的类型,而是因为ListNode已经存在(第五行),为它起一下指针别名而已,以后要声明指向struct node的指针p就可以写LinkList p了。

另:书写多字少字,大小写错误较多,要注意啰……

第2个回答  2013-10-12
1、这样一般为了简化类型名字 或者是统一类型名字使用。
2、node前面typedef就是给struct node换个名字ListNode。
3、没问题,就是char
4、这个不是结构体嵌套,就是定义一个指针,不能指向其他类型,除非类型转换。
5、ListNode 就是 struct node, typedef就是给类型换个名字。
6、没问题。LinkList也是类型,用它定义ListNode型的指针。
相似回答