C学习笔记一、数据1.数据类型分类2.变量与常量变量是程序中数据的存储空间的的抽象。
typedef是C语言的关键字,作用是为一种数据类型定义一个新名字。
3.存储类存储类的属性:作用域(空间)、存储期(时间)、链接点存储方式:静态存储、动态存储。
是就时间属性来区分的。
静态存储方式和静态变量是不同的概念。
静态变量是就链接属性来区分的,有静态局部变量和静态全局变量。
二、字符串格式化输入输出三、运算符、表达式和语句1.运算符种类4.运算符优先级结合性:同一优先级的运算符,运算次序由结合方向所决定。
结合方向由右向左:单目运算符、条件运算符、赋值运算符简单优先级比较:单目运算符> 算术运算符> 关系运算符> 逻辑运算符> 赋值运算符5.运算符相关知识点总结算术---: 数据类型的转换:自动转换和强制转换赋值---:赋值表达式的值与被赋值变量的值得关系;赋值中的类型转换:特别注意有符号与无符号之间的转换造成的BUG;关系---:if( 1 == a ){……},防止错写成“=”造成的隐藏BUG;0为假,非0为真;逻辑---:逻辑量,表达式的逻辑值(0 or 1);sizeof---:s izeof(<类型或变量名>);相同运算符的的嵌套造成的表达式的拓展;6.表达式的概念四、程序结构和控制语句1.3种基本结构:顺序、分支、循环循环:当型循环和直到循环2.C语言控制语句(1)条件判断语句(选择语句):if、switchif:单分支、双分支、多分支if语句的嵌套方式;if-else的配对——就近配对;复合语句被看做是单条语句,且{……}后无“;”switch语句中case标签并没有把语句列表分为几个部分,它只是确定语句执行的入口点,default作用和普通标号一样;(2)循环语句:while和do-while、for、goto-标号(3)转向语句:break、continue、gotocontinue:之后语句不再执行,结束本次循环,开始下次循环;五、数组1.一维数组数组元素可以是基本类型或者构造类型;数组必须逐个元素引用,而不能整体引用;逐个元素通过下标引用;在数组引用中要注意数组越界问题;一维数组初始化的多种形式;eg. int a[10] = {0};冒泡排序核心:if(a[j] < a[j+1])选择排序核心:r = i;for(j = i + 1; j < n; j++)if(a[j] < a[r])r = j;2.多维数组二位数组的行与列:int a[r][v]; r—行,v—列;可以将二位数组a[3][4]理解为含有三个元素:a[0], a[1], a[2],每个元素a[i]都是包含四个元素的一维数组;二维数组的内存分配:按行优先存;a[2][3]:a, a+1 代表行地址,a+1 = &a[1][0];a[0], a[0]+1 代表列地址,a[0]+1 = &a[0][1];3.字符串数组用字符串方式赋值比用字符逐个赋值多占一个字符——“\0”;int scanf( const char * restrict format, ... );左值:L-value中的L指的是Location,表示可寻址。
A value (computer science)that hasan address.右值:R-value中的R指的是Read,表示可读。
in computer science, a value that doesnot have an address in a computer language.字符串处理函数:strcpy(), strcat(), strcmp(), strlen(), strtok();六、指针1.指针的本质是数据类型,而这个变量存的是存储空间的地址值变量是存储空间的抽象,指针类型是存储数据的类型指针和数组名是不同的!!!所有数据类型的指针在32位机上都是32位(4个字节);*(&m)= m;野指针是没有初始化的指针,其指向是随机的;NULL:空指针,指向为空,唯一常量指针。
即int *p = 0; or int *p = NULL;,指向0号存储单元。
但访问零号地址存储值或者修改其值,都是不允许的。
void指针:指向的数据类型是不确定的,只知道指针目标的起始地址,不知道其占用的字节数,必须通过强制类型转换为其他数据类型才能使用;指针的运算:算数运算:p+n, p-n, p++, p--, p-q两个指针相减的结果值不是地址量,而是两个指针之间相隔数据的个数关系运算:p > qconst与指针const int *p; p is a point to const intint * const p const p is a point to int字符指针char *s = "welcome"; = const char *s = "welcome";字符串的首地址赋值给s在程序中使用字符串常量会产生一个“指向字符串的常指针”,当一个字符串出现在一个表达式中时,表达式所引用的值是存储该字符串常量的内存首地址,而不是字符串本身。
2.指针与数组(1)指针与一维数组int a[5], *p;p = a;a[1] = *(a+1),*(p+1) = p[1]数组名是地址常量,指针是地址变量(2)指针与二维数组指针数组int * p[2];int *p[2] 与int (*p)[2] 区别?答:根据运算符的优先级,int* p[2]——p先与[]结合,p是一个数组名,是一个地址值,而数组元素是整形指针。
int (*p)[2]; ——p先与*结合,所以p是个指针,又因为(*p)相当于一个数组名,p是数组指针数组指针编译结果:运行结果:字符指针数组char * a[3] = {"welcome", "to", "suzhou"};3.多级指针不管是几级指针,都是存储内存的编号(地址)4.数据类型与寻址方式数据类型:基本类型(单个存储单元)、构造类型:数组、结构体、共用体灵活的寻址方式实现了数据的结构化,以及结构化数据的存储单元的访问;int *p; //间接寻址int **q; //二次间接寻址int a[4]; //变址寻址、寄存器相对寻址[…],变址运算符,也表示存储单元;…,存储单元的偏移地址;七、函数1.函数基础(1)函数是一个能完成特定功能的代码模块。
把程序中独立的功能封装成函数可以减少重复劳动,使得程序更简洁,可读性更好。
是实现模块化编程的重要工具。
(2)如果返回值的数据类型是void,可以省略return语句,或者写成"return";(3)函数声明的作用函数声明称为函数原型(function prototype)。
用函数原型是ANSI C的一个重要特点。
其作用主要是利用它在程序中的编译阶段对调用函数的合法性进行检查。
所谓合法性检查就是检查函数名是否正确,传递参数的类型、个数、顺序等。
编译器不检查形参名,故可以省略。
(4)一个C程序包含C语句、编译语句、符号等,既要遵从语言规则,又要符合编译规则。
语言规则对应语法错误,编译规则对应语义错误?(5)参数传递值传递、地址(指针传递)、全局变量传递(6)函数和数组传递数组,当形参是数组形式时,其本质上也是一个指针。
几维数组对应几级指针。
例int test( int a[], int *p); int a[] 等价于int *a2.指针函数or 函数指针(1)指针函数char *mystring( void );指针函数不可以返回局部变量的地址,可以返回的地址有3种情况:一、静态变量的地址;static二、字符串常量的地址;“welcome”三、堆上的地址;str = (char*)malloc(20)内存的开辟与释放的本质是:SP的存储值的改变,也即是存储空间指向的改变,原来存储单元的数据依然存在或者被覆盖。
char a[10] = {0}; 0是存储值,ASCII码值,等价于转移字符'\0',打印数组无显示(2)函数指针函数名代表了函数的入口地址int (*pfun)(int, int) 函数指针typedef int (*Pfun)(int, int) 函数指针类型int (*pa[3])(int, int) 函数指针数组,元素是函数指针理解void (*signal(int sig, void(*func)(int)))(int);3.递归函数与循环回调函数attribute机制介绍:函数属性、变量属性、类型属性,都是编译器要处理的八、构造数据类型1.结构体定义结构体变量:先定义结构体类型,再定义变量名;在定义类型的同时,定义变量;直接定义结构体变量;对结构体、联合体中的数组用strcpy()进行赋值。
不能使用数组名直接赋值;位域本质上是一种结构类型;2.共用体不同数据类型的数据使用相同的存储区域,使用方式和结构体一样;3.枚举九、嵌入式C高级用法1.内存管理代码区:code全局变量和静态变量区:RW栈区:局部变量、函数名等堆区:heap,malloc()与free()2.动态内存的申请与释放void* malloc( size_t );void free( void *ptr );两者一定要配对使用,否则内存泄漏;虽然malloc()申请到的空间是连续的,但就从堆的概念上来说,他是由许多分散的内存空间块以链表的数据结构组织一起的集合。
free()之后指针要赋值NULL.利用memset()对申请到的内存空间进行清零;3.堆和栈的区别4.C语言和汇编语言的接口内联汇编_asm_ (汇编语言模块:输出部分:输入部分:破坏描述部分)编译器优化一般将内存变量缓存到寄存器和调整指令顺序充分利用CPU流水线等C语言关键字volatile十、数据结构之线性表1.线性表零个或多个数据元素的有限序列;数学语言描述;直接前驱、直接后继、一对一,位序抽象数据类型:变量形参与指针形参的区别;2.线性表的顺序存储结构定义:用一段地址连续的存储单元存储线性表的数据元素实现方式:一维数组属性:起始位置、最大存储容量(数组长度)、线性表当前长度;地址计算方式:LOC() = LOC() + (i - 1) * c存取时间性能:O(1),随机存储结构;插入删除:O(n)优点:无需为表示表中元素之间的逻辑关系而增加额外的存储空间;可以快速地存取表中任意位置的元素;缺点:插入和删除操作需要移动大量的元素;当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间的“碎片”;3.线性表的链式存储结构(1)基本概念起始结点:是指链表中的第一个结点,它没有直接前驱头指针:是指指向起始结点的指针(没有头结点的情况下)。