欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 08:46:17
...

(个人向)
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()强制刷新缓冲区,这个就比较暴力了。