C语言总结

数据类型

数据类型有:字符型(char)占1个字节、整型(int)占4个字节、短整型(short)占2个字节、 长整型(long)占4个字节(在64位下占8个字节)、单精度浮点型(float)占4个字节、双精度浮点型(double)占8个字节在32位中经常用到的几个数据类型。大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

变量与常量

常量顾名思义是不能改变的量,常量分为几种:字面常量(例如:1,2,3等数字);const 修饰的常变量;#define 定义的标识符常量;枚举常量 。

变量又分为全局变量和局部变量,全局变量的作用域是整个工程,局部变量的作用域是变量所在的局部范围。全局变量不初始化时,默认为0。当全局变量和局部变量同名时,局部变量优先使用。全局变量的生命周期是:整个工程结束;局部变量的生命周期是:从作用域开始到作用域结束。作用域:限定这个名字的可用性的代码范围就是这个名字的作用域。

字符串

字符是用 ‘  ’ 来表示的,而字符串则是用 “  ” 来表示的,字符串结束的标志是 \0 ,不计算在字符串内容里面。转义字符\ddd :ddd表示1~3个八进制的数字;转义字符\xdd :dd表示2个十六进制数字。等号不能用来比较两个字符串是否相等,应该使用库函数strcmp()==0。

操作符 

操作符包括:算数操作符(+  -  *  /  %)                                                                                        移位操作符(>> 算术右移:右边丢弃,左边补原符号位。逻辑右移:右边丢弃,左边补0 。<<左边丢弃,右边补0)                                                                                                              位操作符(&  ^  |):他们的操作数必须是整数。                                                                           

符合赋值操作符(=  +=  -=  *=  /=  &=  ^=  |=   >>=  <<=)                                                                单目操作符(
!      逻辑反操作
-      负值
+      正值
&      取地址
sizeof    操作数的类型长度(以字节为单位)
~      对一个数的二进制按位取反
--      前置、后置--
++      前置、后置++
*      间接访问操作符(解引用操作符)
(类型)    强制类型转换
)、                                                                                                              关系操作符(>
>=
<
<=
!=  用于测试“不相等”
==    用于测试“相等”
)、逻辑操作符(&&   逻辑与;||      逻辑或):短路原则,如果是 || ,前面真后面就不执行,如果是 && 前面为真后面才执行、条件操作符(exp1 ? exp2 : exp3)、逗号表达式(exp1, exp2, exp3, …expN):从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

表达式求值:                                                                                                                                      隐式类型转换
C中的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。整形提升是按照变量的数据类型的符号位来提升的,为0则在前面补0,为1则补1。

算术转换                                                                                                                                          如果操作符中的操作数类型不同,需要算术转换。操作数的类型大小如果较小,则需要转换成类型大小较大的类型。

操作符的属性                                                                                                                                       复杂表达式的求值有三个影响的因素。
1. 操作符的优先级
2. 操作符的结合性
3. 是否控制求值顺序。

关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。typedef  int  add                                函数指针的类型重命名不是放在最后面                                                                                      typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);

关键字static

static是用来修饰变量和函数的,1. 修饰局部变量-静态局部变量2. 修饰全局变量-静态全局变量    3. 修饰函数-静态函数。static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。static修饰全局变量,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

分支语句和循环语句 

用分号隔开的就是一条语句,分支语句有if 和switch,循环语句有for()   do{}while()   while() 。        在书写if和else时要格式对应好,不然else会跟最近的if匹配,在if语句中0表示假,非0表示真。switch语句用于多分支语句,switch语句中的case和default没有顺序要求,case最后最好使用break结尾,不然容易出现错误,switch和if语句一样可以嵌套使用。

在while循环中只要遇到break,就停止后期的所有的循环,直接终止循环,continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

for循环和while循环只是风格不同,while循环的括号内只放入循环结束条件,而for循环的括号内放入的有三个必须条件,修改起来更加便捷。建议:不可在for 循环体内修改循环变量,防止 for 循环失去控制;建议for语句的循环控制变量的取值采用“前闭后开区间”写法。for循环中的continue和break的用法和while循环差不多。for循环可以用于循环次数不确定的情况。

do while循环是先执行一次,再进入while进行判断。do while循环中的continue和break的用法和while循环差不多。

函数

维基百科中对函数的定义:子程序。在计算机科学中,子程序是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

库函数:我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。库函数有IO函数、字符串操作函数、字符操作函数、内存操作函数、时间/日期函数、数学函数、其他库函数。想要学习库函数可以在cplusplus.com - The C++ Resources Network中学习,我经常就是在这学习的。

自定义函数:顾名思义就是自己去定义想一个函数,它是由函数返回类型、函数名和函数参数组成,函数参数又分为实参和形参。函数实参:真实传给函数的参数。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。函数形参:指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形参当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

函数的调用:1、传值调用:函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。2、传址调用:传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操
作函数外部的变量。

函数递归:递归是将一个大的物体不断拆解成多个相似的小的个体,简而言之就是大事化小。递归有两个必要条件,1、存在限制条件,当满足这个限制条件的时候,递归便不再继续。2、每次递归调用之后越来越接近这个限制条件。

函数迭代:迭代和循环有点像,都是重复去做一件事情。

数组

是一组具有相同类型元素的集合。创建数组时,[ ]中要给一个常量才可以,不能使用变量。数组在初始化时,以{ }未全部初始化时剩下的元素默认初始化为0,以“ ”未完全初始化时元素后面跟着一个‘ \0 ’,剩余元素默认初始化为0

sizeof: 计算变量、数组和类型的大小,计算的是数组所占空间的大小,包括‘ \0 ’在内的元素个数。strlen:  只针对求字符串长度,计算字符串的长度时,计算的是‘ \0 ’之前的字符个数。

二维数组初始化时左[ ]可以省略,但是右[ ]不能省略。

数组名是数组首元素的地址,有两个例外:1、sizeof(数组名)   2.、&数组名表示:取出的是整个数组的地址,打印的时候显示的是首元素地址,代表着是从首元素地址开始的。  数组名--都表示整个数组。

指针

指针是一个存放内存地址的变量,地址是唯一标示一块地址空间的。指针的大小是固定的4/8个字节(32位平台/64位平台)。指针类型决定了指针进行解引用操作的时候,能够访问空间的大小,char* 的指针解引用就只能访问一个字节, int* 的指针的解引用就能访问四个字节,double* 的指针的解引用就能访问四个字节。                                                                                                        指针包括: 字符指针char*p、数组指针int(*p)[ ]、指针数组int*p[ ]、函数指针int (*p)(int,int)、函数指针数组int (*p [ ] )(int,int)、指向函数指针数组的指针int (*(*p) [ ] )(int,int) 。                                野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),产生的原因:指针未初始化(和局部变量一样不初始化,会默认初始化为随机值)、指针越界访问(当访问超出范围后,就会变为野指针)或指针指向的空间释放。为了避免出现野指针:指针初始化、小心指针越界、指针指向空间释放即使置NULL、指针使用之前检查有效性。                                                  指针加减整数代表着访问往后(或往前)访问第几个元素,高位指针低位指针可以算出之间的元素个数。允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。void类型的指针可以接受任意类型的地址,但不能解引用操作,也不能加减指针。

const修饰指针变量的时候:
1. const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改
变。但是指针变量本身的内容可变。
2. const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指
针指向的内容,可以通过指针改变。

结构体

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构的成员可以是标量、数组、指针,甚至是其他结构体。结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。结构体传参的时候,传结构体的地址比直接传结构体好,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值