学数据结构对一些C语言语法的反思
2012-08-10 22:23
183 查看
第一个反思:typedef与结构体的反思
例1.1
这个是在学习链表时,其定义的一个结构体引起的反思。
typedef在C中的语法:①给已有的数据类型(char int long)定义一个别名,例如 tyepdef int bit_4;
②简化比较复杂的结构类型声明;此例子正事如此。
该代码应该可以看成三部分组成:
大红色部分为声明一个名为LNode的结构体类型,typedef “红色部分” LNode_A 这一句是给结构体LNode取个别名LNode_A.
那这样做的好处在哪里呢?
如果你要声明一个结构体变量,可以由原来的struct LNode a 简化为 LNode_A a;
则例1.1也可以写成:
另外,要注意“结构体类型定义”与“结构体变量定义”的区别
更详细的结构体说明,参考链接http://wenku.baidu.com/view/4a1f961859eef8c75fbfb384.html
第二个反思:指针作为函数参数传递
在链表章节中,一开始我很不解,为什么传递链表的头指针时,形参定义的是Linklist *L,而Linklist本身就是一个结构体指针,也就是说,用的是指向指针的指针;
看两端代码:
程序1:
程序2:
这是为什么呢?按理说指针做参数,传递的就是地址,但是是哪里出错呢。
请看图解
指针变量,本质上也是变量,只是变量中存放的是地址。假设s是实参,q是形参。传参后,s和q同时指向地址A。在子程序中malloc申请一片内存空间首地址为D,赋给指针q。但是指针s所指向的地址不变。所以..................
更详细的指针传参请参考:http://blog.csdn.net/cffishappy/article/details/6909950
第三个反思:递归中传参时“++”、“--”的反思
看下面程序:
///对二叉树遍历,查找元素为‘d’,并显示d的层数
例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,皆不能求的真确的层数。
相关文章推荐
- C语言一些少见但很有用的语法
- 基于C语言数据结构 一些错误
- c语言数据文件一些语法
- 学习数据结构中一些C语言问题集锦2
- Objective-C语言中的一些常用数据结构
- 一些可运行的C语言数据结构代码
- 自己做的demo---c语言的基本语法,过阵子可以重新写一些算法跟数据结构了
- C语言数据结构的一些值得注意的知识点
- C语言数据结构单链表的一些基本操作
- 读懂严蔚敏C语言数据结构需要弄清楚的N个C语言语法
- 一些C语言语法的细节
- 初学C语言时在语法和语义上容易犯的一些错误
- [置顶] android开发之java的一些基础知识详解,java编程语法,扎实自己的android基本功
- C语言数据结构-栈
- 个人对C语言字节对齐问题的一些见解
- sqlite和sql server语法上的一些区别
- OpenCV程序加速及C++中一些编程语法速度比较
- 一些关于C语言的总结
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 关于C语言的一些零碎知识