typedef struct后面的指针,typedef struct LNode{ 。。。 }LNode,LinkList;从开始到LNode我懂,后面那个指针求解释~
typedef struct后面的指针,typedef struct LNode{ 。。。 }LNode,LinkList;从开始到LNode我懂,后面那个指针求解释~详细介绍
本文目录一览: typedef struct LNode{ 。。。 }LNode,LinkList;从开始到LNode我懂,后面那个指针求解释~
可以这样理解:
typedef int m, *p;
等价于:
typedef int m; //定义一个整型变量。
typedef int *p; //定义一个指向该整型变量的指针。
而提问中的int 替换为struct LNode{ ... }同理;
就是*linklist的作用可以是 (定义一个指向结构体struct LNode的指针变量 ) 比如:
linklist p;
typedef是一种在计算机编程语言中用来声明自定义数据类型,后面的表示定义LinkList为LNode指针类型,用逗号进行分隔可以定义多个类型。typedef struct LNode{ 。。。 }LNode,*LinkList可以拆分为typedef struct LNode{ 。。。 } LNode;和typedef struct LNode{ 。。。 } *LinkList。
例子:
typedef struct LNode{ 。。。 }LNode,*LinkList;
LNode node = {0};
LinkList pNode = &node ; //pNode是一个指向node的指针
c++ typedef struct node PNODE 中的PNODE,这里的指针具体有什么用?
typedef
struct
node
NODE;表示如果定义的
结构体
对象不是指针类型的可以用NODE替换
意思就是说NODE等于
struct
node
NODE
typedef
struct
node
*PNODE表示如果要定义指针类型的对象可以PNODE
s;
PNODE
s;就相当于struct
node
*s;
希望楼主采纳
不懂可以继续追问
typedef struct {...}Pstr; 这个指针是什么意思?
例如:
tyoedef int *Pint;
表示的意思并不是定义一个指向int型指针,而是表示定义一种新的数据类型,这种类型是指向int型的指针,那么如果下面有Pint a;则这时的a是指向int型指针
同理
typedef struct
{
...
}*Pstr;
表示定义一种数据类型,该类型是指向结构体的
所以下面如果有*Pstr p;则p是一个指向结构体的指针
但是很显然p是悬垂指针,而题中这种情况是不能静态分配数据的
所以可以动态的分配一个空间来让p有所指向
C++可以这么做:p=new *p
C没有new语句,那么可以这么做:p=(Pstr)malloc(sizeof(*p));
全手打的,希望对你有帮助
举一个相似的例子,一般指向整型的指针都是如下使用的:
int *p ; 指向一个整型的指针。
如果,在前面我们使用了 typedef int * Pint;
则上面的声明方法,可以改为: Pint p;同样是声明一个指向整型的指针。
上面的结构体是一样的。也同样理解。
首先要理解typedef 和#define的区别:
!.首先typdef 和#define都可以定义一个新的东西
2.但是typdef 具有完整信
而#define 只是程序在预编译是的替换
其次要理解这个问题关键 要理解typedef 的结构
typedef struct node{ ....}node *Pstr;
这里有两个标签node但是是两个不同的东西。只有第二个node 是代表一个结构。(这里省略了)
所以这里就是定义了你给的那个结构体类型变量的一个指针(仅此而已)。
希望我的理解对你有所帮助。。。
typedef struct
{
...
}是定义了一个数据结构,,*Pstr是定义了这个类型结构的一个指针变量
这样写就可以用Pstr去定义和声明 该结构的指针类型
typedef用法小结- -
这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等地方都大量的用到.但是有些地方还不是很清楚,今天下午,就想好好研究一下.上网搜了一下,有不少资料.归纳一下:
来源一:Using typedef to Curb Miscreant Code
Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。
typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。
如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?
使用 typedefs 为现有类型创建同义字。
定义易于记忆的类型名
typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。例如:
typedef int size;
此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size:
void measure(size * psz);
size array[4];
size len = file.getlength();
std::vector vs;
typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有 81 个字符元素的数组:
char line[81];
char text[81];
定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:
typedef char Line[81];
Line text, secondline;
getline(text);
同样,可以象下面这样隐藏指针语法:
typedef char * pstr;
int mystrcmp(pstr, pstr);
这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘const char *'类型的参数。因此,它可能会误导人们象下面这样声明 mystrcmp():
int mystrcmp(const pstr, const pstr);
这是错误的,按照顺序,‘const pstr'被解释为‘char * const'(一个指向 char 的常量指针),而不是‘const char *'(指向常量 char 的指针)。这个问题很容易解决:
typedef const char * cpstr;
int mystrcmp(cpstr, cpstr); // 现在是正确的
记住:不管什么时候,只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身是常量,而不是对象。
代码简化
上面讨论的 typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。例如:
typedef int (*PF) (const char *, const char *);
这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的:
PF Register(PF pf);
Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我们是如何实现这个声明的:
int (*Register (int (*pf)(const char *, const char *)))
(const char *, const char *);
很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:"OK,有人还会写这样的代码吗?",快速浏览一下揭示 signal()函数的头文件 ,一个有同样接口的函数。
typedef 和存储类关键字(storage class specifier)
这种说法是不是有点令人惊讶,typedef 就像 auto,extern,mutable,static,和 register 一样,是一个存储类关键字。这并是说 typedef 会真正影响对象的存储特性;它只是说在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。下面将带到第二个陷阱:
typedef register int FAST_COUNTER; // 错误
编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。
促进跨平台开发
typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以i获得最高的精度:
typedef long double REAL;
在不支持 long double 的机器上,该 typedef 看起来会是下面这样:
typedef double REAL;
并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:、
typedef float REAL;
你不用对源代码做任何修改,便可以在每一种平台上编译这个使用 REAL 类型的应用程序。唯一要改的是 typedef 本身。在大多数情况下,甚至这个微小的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef 来创建这样的平台无关类型:size_t,ptrdiff 和 fpos_t 就是其中的例子。此外,象 std::string 和 std::ofstream 这样的 typedef 还隐藏了长长的,难以理解的模板特化语法,例如:basic_string,allocator> 和 basic_ofstream>。
作者简介
Danny Kalev 是一名通过认证的系统分析师,专攻 C++ 和形式语言理论的软件工程师。1997 年到 2000 年期间,他是 C++ 标准委员会成员。最近他以优异成绩完成了他在普通语言学研究方面的硕士论文。业余时间他喜欢听古典音乐,阅读维多利亚时期的文学作品,研究 Hittite、Basque 和 Irish Gaelic 这样的自然语言。其它兴趣包括考古和地理。Danny 时常到一些 C++ 论坛并定期为不同的 C++ 网站和杂志撰写文章。他还在教育机构讲授程序设计语言和应用语言课程。
来源二:(;id=4455)
C语言中typedef用法
1. 基本解释
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。
2. typedef & 结构的问题
当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;
答案与分析:
1、typedef的最简单使用
typedef long byte_4;
给已知数据类型long起个新名字,叫byte_4。
2、 typedef与结构结合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
这语句实际上完成两个操作:
1) 定义一个新的结构类型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
2) typedef为这个新的结构起了一个名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。
答案与分析
C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。
根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决这个问题的方法有多种:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。
3)、规范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
3. typedef & #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?
typedef char *pStr;
#define pStr char *;
答案与分析:
通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
#define用法例子:
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \\n",c);
}
以下程序的输出结果是: 36。
因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:
#define f(x) (x*x)
当然,如果你使用typedef就没有这样的问题。
4. typedef & #define的另一例
下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
答案与分析:
是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。
#define与typedef引申谈
1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
5. typedef & 复杂的变量声明
在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先为上面表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9];
pFunParam pa;
“typedef struct {...}Pstr ”这个指针是什么意思?
举一个相似的例子,一般指向整型的指针都是如下使用的:
int *p ; 指向一个整型的指针。
如果,在前面我们使用了 typedef int * Pint;
则上面的声明方法,可以改为: Pint p;同样是声明一个指向整型的指针。
上面的结构体是一样的。也同样理解。
typedef struct Node LinkList; 到底怎么理解啊 求解释啊
这样理解:
typedef struct Node *LinkList;
就是把 struct Node * 定义成了新类型 LinkList。这个类型是一个结构体的指针。
回答你的问题:
p是指针,L ->next也是指针,你可以看struct Node的定义就知道了。同类型指针赋值给指针,完全没问题。
插入和删除用到的是实参,如果只传个形参过去是不行的,所以就需要用指向指针的指针。
总之,指针的本质就是数据的地址,这是你理解的关键。
数据结构中的链表这部分确实有点难理解,楼主最好画图理解。加油!
我来回答
第一个问题: 对于节点的操作,我们都是对节点指针操作的,而不是通过直接对节点这个结构操作,L->next其实指的是一个指向下一节点的指针 你的P声明为 节点指针类型,P=L->next表示的的确是一个指针,但是这个指针代表了一个节点,这样你能理解吗?不能理解的话,请追问
第二个问题 在链表的插入删除时都需要对内存进行操作,所以需要指针来实现具体的删除插入,不然的话都是形参,对真正的数据不起作用
typedef struct Node *LinkList 是一个结构体指针类型的别名定义。这里定义了一个名为 'Node' 的结构体,并在结构体名称前添加了 *,使其成为一个指针类型。然后,使用 typedef 将这个指针类型定义为 LinkList,成为了一个新的类型名。
使用这个别名定义后,我们就可以方便地定义一个指向该结构体的指针类型的变量,而不需要在定义变量时再写一遍结构体指针类型的声明。
例如,我们可以这样声明一个指向 Node 结构体的指针类型的变量:
codeLinkList p;
这等价于以下声明:
codestruct Node *p;
但是,使用 LinkList 定义更简洁,更易读。
typedef struct Node *LinkList,就是把bai struct Node * 定义成了新类型 LinkList。
typedef是一种在计算机编程语言中用来声明自定义数据类型,后面的表示定义LinkList为LNode指针类型,用逗号进行分隔可以定义多个类型。这个类型是一个结构体的指针。
p是指针,L ->next也是指针,同类型指针赋值给指针是没有问题的。
第二个问题:在链表的插入删除时都需要对内存进行操作,所以需要指针来实现具体的删除插入,不然的话都是形参,对真正的数据不起作用。
扩展资料:
指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
链表内包含很多结点(当然也可以包含零个结点)。其中每个结点的数据空间一般会包含一个数据结构(用于存放各种类型的数据)以及一个指针,该指针一般称为next,用来指向下一个结点的位置。由于下一个结点也是链表类型,所以next的指针也要定义为链表类型。
C语言 Typedef struct node 定义涉及指针的问题
因为typedef 定义Node是在Node * next;这条语句的后面,他还没有被定义怎么就可以用来定义其他的了呢?总结:
Node * next;这条语句在前,定义Node在后,所以不可以
-物联网校企联盟技术部
Node 等价于 struct list
为什么在结构体内不能用Node?
因为编译器并不知道Node,只有走到Node才能用Node代表struct list。所以在结构体内用到自身指针,必须用 struct list 。
在此后使用 既可以用Node 也可以用struct list 。两者等价
先定义后使用
第一个问题:因为类型名知道声明的末尾才定义完成,所以你在中间使用Node,编译器不能像人一样,看到后面的再来找前面的定义。
第二个问题,typedef 并不是一个类型的关键字,比如int ,double,还有struct 都可以代表一个类型。typedef只是一个表示别称的关键字,比如你朋友叫王二,你可以叫他王二,别人有的人叫他小王。typedef就是取别称的关键字,如果去掉struct,系统不知道它的类型是什么了。
其实相当于
struct list {
int data;
Node * next;//为什么不能用Node定义??
}
现在你想给它取个别称,不想每次就写 struct list mylist, 就把别称 typedef struct list Node; 和声明写到了一起。struct list 表示一种类型 ,对这个类型取别名叫 Node.
比如,你想把int这种类型取别名,可以 typedef int aa, 那么你以后可以用aa b=55,代替int b=55;
struct list 联合起来是你定义的一种类型。
c++中如何在一个结构体里定义一个指向该结构体的指针?
你笔误吧,应该这样写:
struct node
{
int p;
node* next;
};
应该这样:
struct node
{
int p;
struct node *next;
};
如
struct student{
struct student *next;
}
有下面两种方式:
1、
struct s{
char c;
int i;
};
struct *p1;/*p1是指向s结构体的指针*/
2、
typedef struct{
char c;
int i;
}s,*ps;
s *p2;/*p2是指向结构体的指针*/
ps p3;/*p3是指向s结构体的指针*/
typedef struct用法
typedef struct可以用来定义新的数据类型,方便程序员进行编程,用法如下:
一、struct与typedef结合使用
在C语言中,struct是用来定义结构体类型的。当需要定义多个结构体变量时,每次都要写出完整的结构体类型名比较麻烦。此时,可以使用typedef来定义一个新的结构体类型名,从而简化代码的书写,提高代码的可读性。
例如:
```struct student{char name[20];int age;};typedef struct student stu;```
上述代码使用typedef为struct student定义了一个别名stu,以后在定义结构体变量时,就可以直接使用stu而不必再写struct student。
二、什么是typedef
typedef是C语言中的一个关键字,它的作用是给已有的数据类型定义一个新的名字,使得程序更加易读、易理解。typedef的格式为:typedef旧类型名新类型名。
三、应用举例
typedef struct还可以用来定义更加复杂的数据类型,例如链表、树等数据结构。以下是一个定义链表的例子:
```typedef struct Node{int data;struct Node*next;}ListNode,*LinkedList;```
其中,ListNode是定义了一个新的数据类型名,即链表中的节点类型,LinkedList则是一个指向链表头节点的指针类型。
四、拓展知识
typedef不仅可以用来定义新的结构体类型名,还可以用来定义新的函数指针类型名、数组类型名等。使用typedef可以使代码更加简洁,易读,也符合C语言的设计哲学——简单、清晰、高效。
关于typedef struct node这一段每一句什么意思???
// Node 结构体typedef struct node{ struct node *next; // 结构体 node 指针 Buch i; // Buch 类型}Node;// 新建一个结点并返回Node * New_Node(void){ Node * newNode; // 声明一个 Node 类型的指针 newNode = (Node*)malloc(sizeof(Node)); // 分配内存 if( newNode != NULL){ // 内存分配成功 newNode->next = NULL; // 设置下一个结点为空,不存在 memset(&newNode->i,0,sizeof(Buch)); // 初始化内存为 0 }else{ printf("Kein Speicherplatz mehr\n"); // 内存分配失败 } return newNode; // 返回新建的结点}
先看下面这段什么意思
struct node{
struct node *next;
Buch i;
};
它声明了一个数据类型struct node,以后就可以利用这个类型 去定义变量等任务了。
typedef struct node{
struct node *next;
Buch i;
}Node;
在前面加上 typedef后,表明给刚才声明的那个类型起一个新的名字,Node,以后这个Node就可以如同struct node一样去使用(因为Node就是这个类型的另一个名字,这样做是为了以后读程序或输入的时候方便)。
后面的我想就不用解释了,想必楼主都应该清楚了。