好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

c语言难点及分析.pdf

20页
  • 卖家[上传人]:xzh****18
  • 文档编号:46634267
  • 上传时间:2018-06-27
  • 文档格式:PDF
  • 文档大小:217.71KB
  • / 20 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • C语言难点分析整理!语言难点分析整理![转贴转贴] 这篇文章主要是介绍一些在复习 C 语言的过程中笔者个人认为比较重点的地方,较好的掌握这些重点会使对 C 的运用更加得心应手此外会包括一些细节、易错的地方涉及的主要内容包括:变量的作用域和存储类别、函数、数组、字符串、指针、文件、链表等一些最基本的概念在此就不多作解释了,仅希望能有只言片语给同是 C 语言初学者的学习和上机过程提供一点点的帮助 变量作用域和存储类别:变量作用域和存储类别: 了解了基本的变量类型后,我们要进一步了解它的存储类别和变量作用域问题 变量类别 子类别 静态变量(离开函数,变量值仍保留) 自动变量 局部变量 寄存器变量 静态变量(只能在本文件中用) 全局变量 非静态变量(允许其他文件使用) 换一个角度 变量类别 子类别 静态局部变量(函数) 静态全局变量(本文件) 静态存储变量 非静态全局/外部变量(其他文件引用) 自动变量 寄存器变量 动态存储变量 形式参数 extern 型的存储变量在处理多文件问题时常能用到,在一个文件中定义 extern型的变量即说明这个变量用的是其他文件的顺便说一下,笔者在做课设时遇到out of memory 的错误,于是改成做多文件,再把它 include 进来(注意自己写的*.h 要用“”不用字符串型 sprintf(char *,格式化输入) 赋给字符串,而不打印出来。

      课设时用也比较方便 注:注:对字符串是不允许做==或!=的运算的,只能用字符串比较函数 指针:指针: 指针可以说是 C 语言中最关键的地方了, 其实这个“指针”的名字对于这个概念的理解是十分形象的首先要知道,指针变量的值(即指针变量中存放的值)是指针(即地址)指针变量定义形式中:基本类型 *指针变量名 中的“*”代表的是这是一个指向该基本类型的指针变量,而不是内容的意思在以后使用的时候,如*ptr=a 时,“*”才表示 ptr 所指向的地址里放的内容是 a 指针比较典型又简单的一应用例子是两数互换,看下面的程序, swap(int c,int d) { int t; t=c; c=d; d=t; } main() { int a=2,b=3; swap(a,b); printf(“%d,%d”,a,b); } 这是不能实现 a 和 b 的数值互换的,实际上只是形参在这个函数中换来换去,对实参没什么影响现在,用指针类型的数据做为参数的话,更改如下: swap(#3333FF *p1,int *p2) { int t; t=*p1; *p1=*p2; *p2=t; } main() { int a=2,b=3; int *ptr1,*ptr2; ptr1= ptr2= swap(prt1,ptr2); printf(“%d,%d”,a,b); } 这样在 swap 中就把 p1,p2 的内容给换了,即把 a,b 的值互换了。

      指针可以执行增、减运算增、减运算,结合++运算符的法则,我们可以看到: *++s取指针变量加 1 以后的内容 *s++取指针变量所指内容后 s 再加 1 (*s)++指针变量指的内容加 1 指针和数组指针和数组实际上几乎是一样的, 数组名可以看成是一个常量指针, 一维数组中ptr= if(*s=='+'||*s=='-') /*判断是否有符号*/ sign=(*s++=='+')?1:-1; /*用到三目运算符*/ while(*s!='\0') /*对每一个字符进行操作*/ { m=m*10+(*s-'0'); s++; /*指向下一个字符*/ } return m*sign; } 指向多维数组的指针变量也是一个比较广泛的运用例如数组 a[3][4],a 代表的实际是整个二维数组的首地址,即第 0 行的首地址,也就是一个指针变量而 a+1 就不是简单的在数值上加上 1 了,它代表的不是 a[0][1],而是第 1 行的首地址, void Output(ST *); void Bubble(ST *); void Find(ST *); void Failure(ST *); /*函数声明:这五个函数都是以一个指向 ST 型(事先定义过)结构的指针变量作为参数,无返回值。

      / void (*process[5])(ST *)={Input,Output,Bubble,Find,Failure}; /*process 被调用时提供 5 种功能不同的函数共选择(指向函数的指针数组)*/ printf(“\nChoose:\n?“); scanf(“%d“, if(choice>=0 int chinese; int maths; int phy; int total; }ST; main() { ST a[N]; /*存储 N 个学生信息的数组*/ FILE *fp; void (*process[3])(ST *)={Output,Bubble,Find}; /*实现相关功能的三个函数*/ int choice,i=0; Show(); printf(“\nChoose:\n?“); scanf(“%d“, while(choice>=0 if(h==NULL) h=p; else q->next=p; ch++; q=p; } q->next=NULL; /*链表结束*/ return h; } 逆向建立: NODE *create() { char ch='a'; NODE *p,*h=NULL; while(chdata=ch; p->next=h; /*不断地把 head 往前挪*/ h=p; ch++; } return h; } 用递归实现链表逆序输出: void output(NODE *h) { if(h!=NULL) { output(h->next); printf(“%c“,h->data); } } 插入结点(已有升序的链表): NODE *insert(NODE *h,int x) { NODE *new,*front,*current=h; while(current!=NULL } new=(NODE *)malloc(sizeof(NODE)); new->data=x; new->next=current; if(current==h) /*判断是否是要插在表头*/ h=new; else front->next=new; return h; } 删除结点: NODE *delete(NODE *h,int x) { NODE *q,*p=h; while(p!=NULL p=p->next; } if(p->data==x) /*找到了要删的结点*/ { if(p==h) /*判断是否要删表头*/ h=h->next; else q->next=p->next; free(p); /*释放掉已删掉的结点*/ } return h; } 经常有链表相关的程序填空题,做这样的题要注意看下面提到的变量是否定义了,用到的变量是否赋初值了,是否有给分配空间的没有分配空间,最后看看返回值是否正确。

      笔者水平有限,难免有疏漏、错误的地方,浅显之处,还望指正见谅上述内容仅是个提示作用,并不包括 C 语言的全部内容 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.