c语言学习总结(个人向,完结篇)

(个人向)
C语言总结报告
2019-1-10

目录
1编程习惯和认识
2关于代码结构
3数据及其类型
4字符串
5除字符串外的数据输入
6运算符表达式和语句
7指针
8函数
9储存类别,链接和生存周期
10结构体
11文件
12缓冲区

  1. 编程习惯和认识
    代码的测试和维护,可运用注释,debug等,但是我个人比较常用注释,有些时候debug不如注释好用。
    关于写代码,主要是培养自己一个良好的代码习惯,相同等级的代码向左对正,适当的时候选用注释,尽量少用或者不用名字简单的变量,为增强可读性,可以适当选择合适的方式和结构。写出的代码可读性是判断代码好坏的一个很重要的标准。

  2. 关于代码结构
    2.1选择结构
    2.2循环结构
    2.3顺序结构
    关于这三个结构,是比较基本的想法,循环结构里面会涉及到递归,递归虽然想法简单,但是会消耗大量计算机内存,建议用这三个基本结构。

  3. 数据及其类型
    基本数据类型有整形,浮点型,逻辑型,字符型。数据分两种,变量和常量,每一个数据都有自己的数据类型,每个数据类型都拥有自己各自的范围。
    关于stdint.h和inttypes.h这两个头文件,在c99之后,工会讲这两个头文件加入c语言,如果使用的时候数据类型溢出或者范围不够,可以选择这两个头文件,计算机会把int32_t作为int的别名,并且数据范围相比普通int大很多,使用int32_t的时候,计算机会自动替换成与系统相匹配的类型。有些特定的情况下,为了追求计算机运行的速度,inttypes.h被系统定义为对各种系统运行最快的类型。
    有一类特殊的字符叫转义序列,用于表示一些行为:(以/开头)
    \a 警报(ANSI C)
    \b 退格
    \f 换页
    \n 换行
    \r 回车
    \t 水平制表符
    \v 垂直制表符
    \ 输出反斜杠(\)
    \’ 输出单引号(’)
    \” 输出双引号(”)
    ? 输出问号(?)
    \0oo 八进制值(oo必须是有效的八进制数,即每个o代表0-7的数字)
    \xhh 十六进制值(hh必须是有效的十六进制数,即每个h都代表0-f中的一个数)

  4. 字符串
    4.1输入输出
    关于字符串输入有几种方式。gets()函数用于将缓冲区内的字符打入所需要的数组里面,但是不考虑是否溢出的问题。C99后将fgets()加入并且规定输入的最大字数,让程序员自己控制所输入的长度,相比gets()更加先进。也可以不运用c语言本身的输入函数,可以将自己的想法写成一个属于自己的输入函数(用于解决各种问题,比如排除字母只留下数字的输入,这些问题都可以通过自己编写来解决)还有就是是scanf()函数,这个函数可以用来输入各种各样的数据,用于输入字符串的就是scanf(”%s”)来输入,遇到空格或者回车等停止输入。
    关于字符串输出,输出方式多和输入方式配套使用。gets()和puts(),fgets()和fputs(),scanf()和printf(),使用配套的输出方式可以免去很多麻烦。
    关于特殊的输入sprintf(),头文件在stdio.h中而不是在string.h中,函数和printf()类似但是作用不同,sprintf是将数据写入字符串这点需要注意。
    4.2字符串函数
    处理字符串运用字符串函数相比自己写会简单很多,在头文件中加入string.h就可以使用这些文件,包括计算长度的strlen()函数,用于拼接的strcat()strncat(),用于比较的strcmp(),用于拷贝的strcpy()strncpy()等等。(加红标注的是前面字符串函数的高级形式,可以解决文件溢出等其他问题,相比于前面的函数,使用这些函数更加安全。)

  5. 除字符串外的数据输入

5.1字符输入

字符输入一般用getchar()进行输入,和putchar()配套使用,字符指的是在ascll码表中的字符。
输入也可以用scanf(),scanf(”%c”)用于输入一个字符。

5.2其他类型的数据输入

关于常量,在定义之后可以直接赋值(int a=10;int b,b=10;)这样的。
关于变量要从键盘输入,一般使用scanf()进行输入,各种数据类型所用的格式也不同。
Int:%d;	long int:%ld
Float:%f	double:%lf
_Bool:true/false(bool变量比较特殊,c99之后加入,本质上是int类型,多用于判断条件) 
Unsign的标志数据,在各自类型输入的格式加入u,进行改变。

6.运算符表达式和语句

6.1基本运算符号
赋值运算符(=)这个等于号在计算机代码里面作用和数学上面不太一样,但是基本相同,(=)可以用作将(=)右边的值赋值给左边,不代表相等。
(-,+,,/)相对应的就是数学上的加减乘除。
除了这些基本符号之外,还有一些常用的符号:(%)取余数;(&)取地址符号,(!)表示否定常用于(!=不等于);(++,–)对自身经行加1或者减1的操作。
6.2优先级
最基本的就是(
,/)优先级大于(+,-),小括号优先级最高,(++,–)位于两个中间,简单来说就是如此,对于(++,–)来说,和(,/)在一起运算的时候,如何运算会显得奇怪:比如3a++和3*++a,这两个意思是不一样的,为了避免理解错误,请加上小括号。还有两条关于递增递减的建议:
·如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符。
·如果一个变量出现在一个表达式中,不要对该变量使用递增或递减运算符。
6.3类型转换
(int)这样的用()加上类型表示强制转换,将目标数据转换为所需要类型的数据。
将小范围数据扩大为大范围的没有问题(将int转换为long int),只是将储存该数据的内存扩大来存放。
但是将范围大的数据向小范围来转换就有可能出现数据丢失的问题(double变int就可能将小数范围丢掉),会引起一些问题,使用的时候请注意。
7指针
7.1指针用法和理解
指针是指向一块数据的存放该数据地址的东西。类似int类型变量的值是整数,而指针变量的值是地址。可以通过指针直接对这块内存上面的数据进行修改,和函数,结构体连用的时候可以有很好的效果。
7.2指针的创建
创立指针变量的时候,要设想这个指针指向的是什么类型的数据,就定义什么类型的指针。(运用&取地址符号取得地址)
7.3名称,地址,值
在很多语言中地址都归计算机管理,但是对于c来说,可以用&取地址符取得该地址,从而对地址上的值进行修改,通过这个方法可以解决很多问题。
8函数
8.1函数的理解
计算机函数和数学上面的函数有点不同,对我自己理解来看,计算机函数可以有多个或者没有输入,一个或者没有输出(没有输出似乎没啥用),一个或者没有返回值。
8.2函数的返回值
就是调用这个函数结束后返回给主函数的东西,可以是int,double,bool等都可以,也可以没有,比如void,选择不同类型的返回值对解题有很大帮助。
8.3函数的输入值
函数可以没有输入,也可以有一个甚至多个输入,在函数头中写入所需要的形参
注意:函数调用的时候,形参和实参是不一样的,例如有个函数是void swap(int a,int b){
Int temp=0;
Temp=a;
a=b;
b=temp;
}
这个函数在调用的时候使用swap(a,b)其实不能将a,b进行互换,因为函数里面所调用的a和b和给进去的a,b不是同一组值,函数独立开拓一块内存进行运行这个过程把真的a值给形参a,b值给形参b,然后形参a,b之间进行交换,交换结束之后却没有对原来的数据进行交换。
如果使用指针配合函数进行就可以进行交换了,这是我认为的指针好用的地方之一。
9储存类别,链接和生存周期
这个就当了解一下:auto储存类别说明符(注意auto在c和c++里面用法完全不同)static静态存储,register寄存器变量,extern外部存储变量(即使用的时候使用的是位于别处的变量)
一开始对指针使用不熟练的时候,我经常会使用extern来完成数据的传输,后来熟练指针后就没怎么使用了,一般用的比较多的是static,在这一方面并不是很熟悉。
10.结构体
关于结构体,第一次了解到结构体的时候,感觉和二维数组有异曲同工的地方,但是使用起来不论是方便程度还是梳理思路,都比二维数组要好很多,而且可以自己定义自己想要的类型,使用范围比二维数组广好多。
用.运算符去拜访结构体中的每个变量(用拜访感觉好奇怪),然后对数据的处理和普通的数据没有上面不同。用->运算符去拜访指向结构体的指针中的数据(好别扭QAQ)。
将结构体和指针一起运用的时候就发现很多好玩的东西,比如链表,单链表,多链表,二叉树等等,明年数据结构会详细讲解。
11.文件
关于文件,我其实对文件的理解不如前面的东西,如果说前面几个学了9成的话,文件的操作我大概学了7成左右吧。
文件的开启和关闭,要用到fopen()和fclose()函数,有一个指向文件的指针,FILE *fp;fp=fopen(“文件名”,‘打开方式’)
文件的打开方式有好几种:
R 以读的模式打开文件
W 以写的模式打开文件
A 以写的模式打开文件
还有a+,w+等是c11后对文件操作的补充,ab,wb等就是以二进制模式打开文件。
文件中的操作和普通数据差不多,多了几个函数getc(),putc()等,联合文件指针一起使用,达到的效果和getchar()和putchar()类似,从本质上讲,putchar其实是由getc()转变过来的,只不过是putchar()改成从键盘输入。
有三个特殊的文件指针,stdin键盘,stdout显示器,stderr显示器,这三个对应的标准文件是标准输入,标准输出和标准错误,这就是为什么我理解putchar()和getc()的原因,getc(stdin)其实就是putchar()。
12.缓冲区
这个是我自己加入c语言里面的,虽然c语言好像没有讲这个,但是我个人觉得c语言中最难的部分就是指针和缓冲区吧,所以自己将缓冲区加入到里面来。
我个人对缓冲区的理解,缓冲区就是在你按下回车,将缓冲区的数据发送给电脑进行处理的时候,就会出现很多问题,假如你需要给a和b两个字符,中间用回车隔开一开始我是这么写的:getchar(a);getchar(b);然后输入一个a的值后按回车你会发现程序就结束了,根本就没有输入b的情况,就是你输入回车的时候虽然将a的值给了,但是同时也将\n(回车)也同时赋值给了b,就会产生一系列的问题,很多时候不是你的程序结构出了问题,可能只是缓冲区的输入问题,包括scanf()等都有缓冲区这个问题,会让你调试的时候显得很奇怪。
解决的方法:
7. 使用scanf(’\n’),或者getchar()将回车给去掉(我一般用这个方法,一般能够看出来哪里有缓冲区问题)
8. 使用fflush()强制刷新缓冲区,这个就比较暴力了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章