关于c语言的常用知识点有哪些

刘莉莉

C语言知识点大汇总

◆知识点1:交换两个变量值的方法

1)采用第三方变量(最容易想到的方法)

2)采用加减法进行值得交换(面试时常用**)

代码如下:

b = a - b;a = a - b;b = a + b;

3)采用按位异或的位方式

代码如下:

a = a^b;b = a^b; a = a^b;

◆知识点2:取余运算%的结果与被除的符号相同,结果为两个正数取余后前面加符号

◆知识点3:sizeof的使用

sizeof是一种运算符不要想当然理解为函数

sizeof使用时可以不加()

sizeof可以加变量、常量、数据类型

跟数据类型是必须加()

◆知识点4:#include编译预处理命令与多文件团队开发

include编译预处理命令可以认为是:将后面的文件内容拷贝到当前的文件中

多文件团队开发:模块分别编译成.o都不能链接成功,合起来链接生成最终程序。

链接:把项目中所有相关联的.o目标文件、C语言函数库合并在一起,生成可执行文件

——函数的定义放.c文件,函数的声明放.h文件

——如果要使用某个.c文件中定义的函数,只需要#include这个.c文件对应的.h文件

——h文件的作用:被别人拷贝。编译链接的时候不需要管.h文件

◆知识点5:数组的几种初始化方式如下:

int a[3] = {10, 9, 6};int a[3] = {10,9};int a[] = {11, 7, 6};int a[4] = {[1]=11,[0] = 7};(知道有此种初始化方式即可)

◆知识点6:数组的内存分析和注意点

存储空间的划分(内存的分配是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的)【注:对于以后学习重要】

数组名的作用,查看元素地址

注意数组不要越界

◆知识点7:字符串知识点

"123”其实是由’1’、’2’、’3’、’\0’组成

字符串的输出”%s”,’\0’是不会输出的

◆知识点8 : 字符串处理函数:strlen()

计算的是字符数,不是字数

计算的字符不包括’\0’,一个汉字相当于3个字符

例子:"哈haha" 字符数为7

从某个地址开始的数字符个数,知道遇到’\0’为止

指针部分在C语言中占据重要地位,所以重点学习与整理了指针的知识:

◆知识点9:指针定义的格式

变量类型 *变量名

如:Int *p

◆知识点10:指针作用

能够根据一个地址值,访问对应的存储空间

例:

Int *p;Int a = 90;P = &a;*p = 10;//把10赋值给p所指的存储空间

◆知识点11:指针使用注意

Int *p只能指向int类型的数据

指针变量只能存储地址

指针变量未经初始化不要拿来间接访问其他存储空间

◆知识点12:指针与数组

遍历数组

int ages[5] = {10, 4, 9, 44, 99};for(int i = 0; i<5; i++){ printf("%d\n", ages[i]);}

使用指针遍历数组:

int *p;// 指针变量P指向了数组的首地址p = &ages[0];// 使用指针遍历数组for(int i = 0; i<5; I++){ printf("ages[%d] = %d\n", i, *(p + i));}

注:指针+ 1取决于指针的类型

注:数组的访问方式

数组名[下标]

指针变量名[下标]

*(p + i)

◆知识点12:指针与字符串

定义字符串的两种方式:

1、利用数组

Char name[] = “Andyzhao”

特点:字符串里的字符可以修改

适用场合:字符串内容需要经常修改

2、利用指针

Char *name = “itcast”

特点:字符串是一个常量,字符串里面的字符不能修改

使用场合:字符串的内容不需要修改,而这个字符串经常使用

◆知识点13:预处理指令(三种):

宏定义

条件编译

文件包含

1、宏定义的配对使用和带参数的宏:

#define ... #undef

带参数的宏:

#define sum(v1,v2) ((v1) + (v2))//括号是必须的

例如:

#define pingfang(a) a*a #define pingfang(a) (a*a)

调用时

pingfang(10)/pingfang(2)//不正确 pingfang(5+5)//不正确 带参数的宏效率比函数高

2、条件编译(一般是判断宏的值)

#if 条件 ... #elif 条件 ... #else ... #endif(非常重要)不然后面的代码全部无效

3、文件包含:

<>表示系统自带的文件,""表示自定义文件

不允许循环包含,比如a.h包含b.h,b.h又包含a.h

◆知识点14:typedef 只是给类型起了个别名并不是定义新类型

struct Student{ int age; char *name; }; typedef struct Student Student; 等价于typedef struct Student{ int age; char *name; }Student; 也等价于typedef struct { int age; char *name; }Student;

类似的给枚举类型起名

typedef enum Sex { Man,Women }Sex;

下面这种情况的写法比较特殊

//下面是函数指针类型的自定义数据类型,返回值类型和参数类型要匹配

#include typedef int (*TypeFuncPointer)(int, int); int add(int a, intb) { return a + b; } int minus(int a, intb) { return a - b; } int main() { TypeFuncPointer p = add;//使用自定义类型? TypeFuncPointer p2 = minus;//使用自定义类型? printf("add = %d\n",p(1, 2)); printf("minus = %d\n",p2(1, 2)); return 0; }

下面是定义结构体的指针类型

typedef struct Student{ int age; char *name; }*PtrStu; //使用方式 Student stu ={18, "zhangsan"}; PtrStu p = &stu;

宏定义也是可以为类型起名的

#define Integer int 相当于typedef int Integer

注意和typedef的区别

例如:

typedef char * String #define String2char *

◆知识点15:static和 extern区别是能否进行跨文件访问

①.函数

②.变量

1、对函数的作用:

外部函数:定义的函数能被本文件和其他文件访问

内部函数:定义的函数只能被本文件访问

默认情况下,所有函数都是外部函数(相当于带关键字extern),所以可以省略

extern作用:

完整的定义和引用一个外部函数都加extern

引用时也是默认是外部函数所以也省略extern

static作用:定义一个内部函数

使用:static返回类型函数名(参数列表)

不能被其他文件调用

一个项目中,本文件的外部函数名不能和其他文件的外部函数同名(error)

本文件中的内部函数(static)可以和其他文件的函数名同名的

2、对变量的作用:

全局变量分为两种:

外部变量:定义的变量可以被其他文件访问

①.默认情况下所有的全局变量都是外部变量

②.不同文件中的同名外部变量都代表同一个

③.定义一个外部变量不加extern,声明才加extern

同样的声明是没有错误的

内部变量:定义的变量不能被其他文件访问

学好C语言必须要掌握四个知识点

(一) 基本的数据操作,运算规则,常见程序结构设计

很多人觉得这么几点我都看了多少遍了,早就烂熟于心了。举个简单的例子,printf打印可能是最常使用的函数了,但是这个函数在真正大型工程中,很少直接去调用,为什么?

主要项目中涉及到封装的概念,什么时机加入打印在调试大型系统的时候,更容易定位问题,这些编程思维对于初学者来说很难接触到,也很难想到,任何复杂的事物都是由简单的细节环绕而成,在学习之初不要觉得这些很简单的数据操作很简单,要真正纳入自己的知识体系还是需要花点心思。可以在学习的时候,网上搜一些资料看这些数据操作以及运算规则是如何使用具体的场景中。

很多人初学者可能会有疑问觉得去哪里找这些代码去,世界软件发展了这么多年,最不缺的就是代码,在github或者开源中国里面代码多如牛毛。学习的对象也是数不胜数。有点扯远了,这触及到另外一个学习编程的步骤,学会看懂别人的代码,然后才能尝试写出优质的代码,知己知彼百战不殆。曾经听一个编码高手说过“技术这东西只要花的时间长,肯下功夫早晚都能搞定,只要进入状态了,什么方法都能想的出来”,看书学习也罢,看视频学习也罢,需要让自己插上联想的翅膀,把自己的思维境界打开。

说到运算规则,涉及到代码的格式的问题,说说身边人的事情,去年招了一个刚毕业的学生,基本功不是很好,但是有一个特质专注力很高,能沉得住气。当初见第一眼就觉得是个做软件的苗子,有了第一印象后面的事情就顺理成章了。很多经验不是很足的同学,参加面试回答的问题也不是很理想,但还是被录取了,其中一个因素就是你身上有公司需要的基因,这多少算来有点运气的成分在里面了。今年这哥们觉得很突然,说为啥当初刚开始写代码的时候为啥不要求那么严格,说了几句话,初学者特别是基础很差的情况下,要求太多只会让一个人慢慢失去对这个行业的信心,也许会错失一个软件天才。随着时间推移能够迈入轨道了,那么就该要求一些基本的职业素养了,代码的格式,就该要求了。很多初学者觉得写的代码越高深,越让人看不懂才叫高手,有这种想法的趁早打住。大道至简,这四个字在任何时候都不过时。做的复杂逻辑混乱只能说明当初在设计的时候,没有彻底想明白,想明白了展示出来一般都比较舒坦平整。

(二) 指针,数组,结构体,枚举灵活运用

不要只看这几个字,几乎是C语言里面最精髓的代表。数组这个概念基本上还能理解透彻,说到指针这个应用场景太多,而且在什么项目中几乎都离不开指针的使用。变化无穷,会用的觉得其乐无穷,不懂的哭上天。记得在互联网有个流传很长时间的文章,林锐的我的大学十年(有兴趣的同学可以去网上查阅,编程的人生也可以很彪悍,记得当初发烧期间还专门买了林锐的一本高质量编程)提到了做了一个C语言的项目,为了绕开指针最后全部用数组代替实现了,后来做的项目也黄了。不是说因为用数组使用就不行,项目的定位方向出问题了。用数组完全替代指针这条路也是可行的,但是会花费相当大的周折。

说到指针,不能不提到计算机专业开的另外一个课程,数据结构。数据结构就是原生数据或者组合数据的混合运用的一种规则集合。连接这些数据,将这些数据有机的串联在一起,指针起到非常关键的作用。经常见到初学者说数据结构和天书差不多,几乎看不懂,建议回炉好好学习指针,说到指针还是存在很多故事,在入门之初有幸遇到一位水平极高的老手带着,基本功扎实的不得了,记得有一次使用指针忘记初始化,这老手叹了口气,当年我每次用指针错一次,就被项目经理当众批评一次,后来再也不敢不初始化使用了,所以印象才能这么深刻,话说到这里刚入门的小白挨多少批评或者鄙视,是最正常不过的事情了,这对于编程界来说稀松平常。

结构体在项目中用的特别多,很多初学者觉得结构体都在教材的最后章节,觉得不是那么重要。其实结构体在一定层次上决定着软件的脉络框架。很多高手在设计模块的时候,不是急急忙忙的写代码,而是先把头文件里面的结构体设计出来,简单的来说就是把数据模型先搞起来。有个数据模型代码实现起来就比较轻松了。面向对象里面类的老祖宗就是结构体延伸来的。关于结构体如何赋值,包含着指针的情况下,如何赋值这些都是常见的初学者经常容易掉的坑。枚举一般用在罗列不同类别,存在多个相同功能的实物,搭配switch使用的很多,在这就不一一列举了。

(三)活用函数

函数是面向过程编程最基本的单位,任何C程序的运行都有函数的身影,因为程序的入口main就是一个函数,函数传值方式,调用方式(递归,回调)都是函数内在的表现。函数的里面又可以嵌套别的函数,使得程序慢慢变得复杂化。前几天和一个非计算机专业的聊天,谈到如何学习函数,说到了数学不好是不是编程不好学。函数的编程基本因子,和数学里面的函数有一定的共性,但编程里面的含义引申的层次更多,数学在一定层面就是提供一个工具或者方法而已,函数的设计里面夹杂着诸多的编程思想。

检验一个程序员水平的高低可以简单让用函数实现一个相对复杂一些的功能,基本上就能看出编程思想掌握的深浅程度。不妨自己实现一个函数,检验下自己编程水准,函数的检验是面试里面必不可少的题目。

一个函数基本上代表一个小的模块,多个模块有机的组合形成一个系统。建议初学者在学习函数的时候,不要满足于会使用函数,还要让自己站的层次更高一点。这能决定自己是一个纯粹的执行者还是未来框架的设计者,不要觉得这些东西距离自己很远,慢慢的积累时间长了,慢慢也就从量变变成质变了。

(四)对于内存和性能有少许的理解

内存和性能对于初学者来说,可能觉得很遥远,其实这两样东西贯穿整个编码界,检验软件功能最重要的两项指标,软件占用内存多少,运行时间长了会不会让系统变缓慢。同时开启在多个软件的时候,你设计的软件是不是变得很卡顿,这些都是大家平常在使用软件时候经常遇见的现象。今天在车上闲聊,司机说当年的XP运行的多好,非要升级搞什么windows7或者windows10之类的,把电脑搞的卡的要死。这其实是微软操作系统设计理念的一个延伸,用空间换时间。说的通俗点,提前把一些常见的软件加载到内存里面,使用的时候流畅度会感觉好一些,理念这么好,为啥还变得这么卡慢,主要机器配置太低了。微软这帮大佬认为你机器内存和CPU还是相当不错的,因为现在硬件成本基本上接近白菜价了。在机器配置还不错的情况下,windows7,10运行的速度还是很不错的。透过这些生活常识,归结对编程,对编码的认知程度上,慢慢就会建立起自己的知识体系。

这点在嵌入式设备上表现的很明显,一般嵌入式设备内存和cpu配置不是高,内存就要省着点用,占用CPU很高的一些函数尽量少去调用,避开雷区,这些经验就要靠平时多去积累,多去思考,才会融入自己知识体系,才会慢慢认识到写代码其实在编程时候,只占很小的一部分,大部分的时间还是在思考如何让代码更加利索,内存更少的去使用,cpu占用率低一些。认识到这些时候,层次就不一样了,就会越来越觉得设计思想的重要性了。

C语言基础知识点

【知识点1】C程序

C语言程序结构有三种: 顺序结构 , 循环结构(三个循环结构), 选择结构(if 和 switch)

【知识点2】main函数

每个C语言程序中main 函数是有且只有一个。读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。

【知识点3】存储形式

计算机的数据在电脑中是以二进制的形式保存。最低的存储单元是bit(位),位是由为 0 或者1构成。 byte 是指字节, 一个字节 = 八个位。数据存放的位置就是它的地址。

【知识点4】注释

是对程序的`说明,可出现在程序中任意合适的地方,注释从“/*”开始到最近一个“*/”结束,其间任何内容都不会被计算机执行,注释不可以嵌套。

【知识点5】书写格式

每条语句的后面必须有一个分号,分号是语句的一部分。一行内可写多条语句,一个语句可写在多行上。

【知识点6】标识符

合法的用户标识符考查:

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了。

C语言标识符分如下3类

(1)关键字。它们在程序中有固定的含义,不能另作他用。如int、for、switch等。

(2)预定义标识符。预先定义并具有特定含义的标识符。如define、include等。

(3)用户标识符。用户根据需要定义的标识符,符合命名规则且不与关键字相同。

关键字不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If 是可以做为用户标识符。因为If 中的第一个字母大写了,所以不是关键字。

【知识点7】实型数据

实型数据的合法形式:小数形式和指数形式。掌握判定指数形式合法性。

2.333e-1 就是合法的,且数据是2.333×10-1。

考试口诀:e 前e 后必有数,e 后必为整数。

【知识点8】字符

字符数据的合法形式::

1 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。

0 的ASCII 数值表示为48,a 的ASCII 数值是97,A的ASCII 数值是65。

字符型和整数是近亲:

char a = 65 ;

printf(“%c”, a); 得到的输出结果:a

printf(“%d”, a); 得到的输出结果:65

一般考试表示单个字符错误的形式:65 "1"

字符是可以进行算术运算的,记住: 0-0=48

大写字母和小写字母转换的方法: A+32=a 相互之间一般是相差32。

【知识点9】整型数据

整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节:

考试时候一般会说,在16 位编译系统,或者是32 位系统。碰到这种情况,不要去管,

一样做题。掌握整型一般是两个字节, 字符型是一个字节,双精度一般是4 个字节就可以了。

【知识点10】转义字符

转义字符的考查:

在程序中 int a = 0x6d,是把一个十六进制的数给变量a 注意这里的0x 必须存在。

在程序中 int a = 06d, 是一个八进制的形式。

在转义字符中, ’x6d’ 才是合法的,0 不能写,并且x 是小写。

‘141’ 是合法的, 0 是不能写的。

‘108’是非法的,因为不可以出现8。

【知识点11】算术运算

算术运算符一共有+、—、*、/、%这五个。%符号两边要求是整数。不是整数就错了。

三种取整丢小数的情况:不是四舍五入是舍掉小数部分。

1、int a =1.6;

2、(int)a;

3、1/2; 3/2;

【知识点12】强制类型转换

将一个运算对象转换成指定类型,格式为(类型名)表达式

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b) 和(int)a+b 的区别。前是把a+b 转型,后是把a 转型再加b。

【知识点13】赋值

是表达式就一定有数值。

赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

复合赋值运算符:注意:a*=m+2 是 a=a*(m+2)

自加、自减表达式:假设a=5,++a(表达式的值为6), a++(表达式的值为5);

j=a++;等价于j=a;a=a+1; 而j=++a;等价于a=a+1;j=a;。

考试口诀:++在前先加后用,++在后先用后加。

【知识点14】逗号运算

逗号表达式:优先级别最低; 表达式的数值逗号最右边的那个表达式的数值。

(2,3,4)的表达式的数值就是4。

【知识点15】数制转换

一定要记住二进制 如何转换成十进制。

八进制是没有8 的,逢8 进1,018 的数值是非法的。