第一个反思:typedef与结构体的反思
例1.1
typedef struct LNode {
int data;
struct LNode *next;
}LNode_A;
这个是在学习链表时,其定义的一个结构体引起的反思。
typedef在C中的语法:①给已有的数据类型(char int long)定义一个别名,例如 tyepdef int bit_4;
②简化比较复杂的结构类型声明;此例子正事如此。
该代码应该可以看成三部分组成:
typedef struct LNode {
int data;
struct LNode *next;
}LNode_A;
大红色部分为声明一个名为LNode的结构体类型,typedef “红色部分” LNode_A 这一句是给结构体LNode取个别名LNode_A.
那这样做的好处在哪里呢?
如果你要声明一个结构体变量,可以由原来的struct LNode a 简化为 LNode_A a;
则例1.1也可以写成:
typedef struct LNode {
int data;
LNode_A *next;
}LNode_A;
另外,要注意“结构体类型定义”与“结构体变量定义”的区别
struct A{
......
......
};
以上代码是结构体类型定义,定义{}中的结构为一个名词为“A”的数据类型;
struct {
.......
.......
}A;
以上代码是结构体变量定义,其中A为一个匿名的结构体数据类型的变量。A的本质是变量,是占用内存空间的。
更详细的结构体说明,参考链接http://wenku.baidu.com/view/4a1f961859eef8c75fbfb384.html
第二个反思:指针作为函数参数传递
在链表章节中,一开始我很不解,为什么传递链表的头指针时,形参定义的是Linklist *L,而Linklist本身就是一个结构体指针,也就是说,用的是指向指针的指针;
看两端代码:
程序1:
void myMalloc(char *s) //我想在函数中分配内存,再返回
{
s=(char *) malloc(100);
}
void main()
{
char *p=NULL;
myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?
if(p) free(p);
}
程序2:
void myMalloc(char **s)
{
*s=(char *) malloc(100);
}
void main()
{
char *p=NULL;
myMalloc(&p); //这里的p可以得到正确的值了
if(p) free(p);
}
这是为什么呢?按理说指针做参数,传递的就是地址,但是是哪里出错呢。
请看图解
指针变量,本质上也是变量,只是变量中存放的是地址。假设s是实参,q是形参。传参后,s和q同时指向地址A。在子程序中malloc申请一片内存空间首地址为D,赋给指针q。但是指针s所指向的地址不变。所以..................
更详细的指针传参请参考:http://blog.csdn.net/cffishappy/article/details/6909950
第三个反思:递归中传参时“++”、“--”的反思
看下面程序:
///对二叉树遍历,查找元素为‘d’,并显示d的层数
void DisplayBittree(BitTree *t,int i)
{
if (*t)
{
BitNode *p;
p=*t;
ElemType e;
e=p->data;
if (e=='d')
{
printf("%d\n",i);
return ;
}
else
{
DisplayBittree(&((*t)->lchild),i+1);
DisplayBittree(&((*t)->rchild),i+1);
}
}
}
DisplayBittree(&((*t)->lchild),i+1);
DisplayBittree(&((*t)->rchild),i+1);
这2句改为i++或者++i,皆不能求的真确的层数。