* 号 typedef 结构体等,不是很懂,求解释!
本帖最后由 ZhaoYuBetter 于 2014-5-19 18:09 编辑typedef struct Node{
ElemType data;
struct Node *next;
} Node;
问题1:变量名跟结构体名字一样,好奇怪
问题2:这里的Node到底指什么?LinkList为什么加 * 号,下行代码求大神详细解释!
typedef struct Node *LinkList;
/* 初始化顺序线性表 */
问题3:这里传参数 *L 为什么要个 *?下面方法又不加 *;
Status InitList(LinkList *L){
*L=(LinkList)malloc(sizeof(Node));
if(!(*L)) {
return ERROR;
}
(*L)->next=NULL;
return OK;
}
问题4:这里L没有加 *, 但是访问其成员可使用”->“,而不是用”.“
用”.“ 报错,修改成*L,也是报错
int ListLength(LinkList L){
int i=0;
LinkList p=L->next;
while(p) {
i++;
p=p->next;
}
return i;
}
以上4个问题,搞不清楚,请鱼油,帮帮解决,万分感谢!
以上4个问题,搞不清楚,请鱼油,帮帮解决,万分感谢!
首先:会员居然没鱼币,太小气了!
其次:你需要权威答案:
oggplay 发表于 2014-5-19 20:12 static/image/common/back.gif
首先:会员居然没鱼币,太小气了!
其次:你需要权威答案:
多谢!我看看先! 问题一个人观点:结构变量并不分配地址 只是标示结构体变量名才会分配内存空间
问题二个人观点:用LinkList定义一个变量是 如 LinkList L时相当于struct Node *L,L是一个指向一个LinkList结构的变量,同时问题四也就解决了
问题三个人观点:用LinkList *L定义的*L等同于struct Node **LL是一个指向指针的指针。 顶楼上的 画了个图 你的代码看着眼熟,是大话数据结构里的吧?
问题一:是C语言历史残留问题,部分纯C的编译器,使用结构体的时候要struct XX a这样用,像问题一那样typedef一下,就可以XX a这样声明了。如果你用的是VS等,默认是用C++编译器编辑这些代码,所以不用加struct,是不是typedef也就无所谓了
问题二:LinkList加了*号就是指针了,这个你得先明白指针为什么会被用在函数参数中,和直接传值有什么区别。
问题三:因为这里要改变指针的值,需要用二级指针才可以。
问题四:好吧,你还是多看看C语言的书籍吧。。。。关于指针你不懂的太多了
宏定义和别名在windows程序的应用
别名
typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量用到。
它有助于创建于平台无关类型,甚至能隐藏复杂和难以理解的语法,使用typedef可编写出更加美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性以及未来的可维护性。
1·类型别名
typedef int size;
size fishc;//声明一个整型变量fishc
2·可以掩饰复合类型,如指针和数组
typedef char arr;
arr line;//声明一个大小为81的字符型数组line
typedef char *ptr;
ptr str;//声明一个字符型指针str
3·typedef与结构体结合使用
typedef struct TopMystruct
{
...
}Mystruct;
Mystruct student;//声明一个struct TopMystruct 类型的变量student
宏定义
1·简单的define定义
#define MAXTIME 1000
//编译器在处理代码之前会对MAXTIE进行替换为1000
2·define的“函数定义”
#define max(x,y) (x)>(y)?(x):(y)
//这个定义就会返回两个数中较大的那个。因为这个“函数”没有类型检查,就好像一个函//数模板似的,当然,它绝对没有模板那么安全就是了。
3.1·宏的单行定义
#define A(x)T_##x
#define B(x)#@x
#define C(x)#x
假设x = 1,则有:
A(1) == T_1//直接把x粘贴上去
B(1) == '1'//把x带上单引号后粘贴上去
C(1) =="1"//把x带上双引号后粘贴上去
3.2·define的多行定义
#defineMACRO(arg1,arg2)do{\
/*declarations*/\
stmt1;\
stmt2;\
/*...*/\
}while(0)/*(notrailing;)*/
关键是换行的时候要加上一个“\”
4·条件编译
在大规模开发,特别是跨平台和系统的软件里,define最终要的功能是条件编译。如下:
#ifdefWINDOWS
// 如果 WINDOWS 宏被定义了,就执行这里的内容
#endif
#ifdefLINUX
// 如果 LINUX 宏被定义了,执行这里的内容
#else
// 如果 LINUX 宏没有被定义,执行这里的内容
#endif
在windows编程中的应用
1·定义常量提高可读性
2·灵活替换
3·防止头文件被重复定义
4·重新定义一些类型
5·得到指定地址上的一个字节或字
#defineMEM_B(x)(*((byte*)(x)))
#defineMEM_W(x)(*((word*)(x)))
浩fly 发表于 2014-5-21 20:33 static/image/common/back.gif
宏定义和别名在windows程序的应用
别名
typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类 ...
非常感谢你 oggplay 发表于 2014-5-19 20:12 static/image/common/back.gif
首先:会员居然没鱼币,太小气了!
其次:你需要权威答案:
aaaaaaaaaaaaaaaaaaaaaaaaaa
页:
[1]