1.C语言基本概念
源文件:.c文件
头文件:.h文件(head)
C语言代码由源文件和头文件组成。
返回值要和函数的声明值的类型对应
2.写代码的步骤
(1)编辑代码
(2)编译得到可执行文件gcc hello.c -o hello
(3)执行程序./hello
(4)调试
3.int整型变量如果算出来是小数,则自动舍去小数部分。浮点数float(小数点后六位)如果精度不够简单情况下就按照精度四舍五入,double精度更高(小数点后16位)。printf中打印整数用%d,打印浮点数用%f。
4.字符型,对应ASCII,码是一种编码,用数字编码表示一个符号。本质上也是整型,只是整形数被用来表示ASCII编码值,所以叫字符型。一般用8位二进制表示,无符号范围是0~255。printf中%d打印的是ASCII对应的十进制数,%c打印的是ASCII对应十进制数的字符符号。
5.符号数如signed int、signed float、signed char;无符号数如unsigned int、unsigned char(没有无符号的浮点数)。有符号数范围是-128~127。
6.代码风格
空格、空行、注释、文件头、函数头
7.a++和++a的区别
b = a++先赋值后加1;b = ++a先加1后赋值。
8.C语言中三种程序结构:顺序结构、选择结构(分支结构,if else、switch case)、循环结构(for、while、do while)
9.定义了一个局部变量但没有初始化时,值是随机的;定义了一个全局变量但没有初始化时,值为0.
10.函数三要素
函数定义。函数声明:包括函数名、传参变量及类型、返回值类型。函数调用。
11. c语言中引用字符时要加单引号,引用字符串时加双引号。常用字符串方式初始化字符数组。(注:a[]=“abcde”实际上有6个字符,为‘a’‘b’‘c’‘d’‘e’‘\0’,‘\0’是字符串的结尾标志,表示空字符。%s打印字符串。)
12.指针。
int *p;p=&a;*p=111。
定义指针型变量p;把a的地址赋值给p;把111赋值给指针p所指向变量的值。
一二句可以合并为int *p=&a。
%p用于打印指针变量的值。
int *p是指针所指的变量是int型,而指针p本身是指针型变量。
13.指针与数组的初步结合
(1)int a[5] = {555, 444, 333, 222, 111};
int *p;
//p = &a; //编译报警告,但是结果是对的,555
//p = &a[0]; //正确,555
//p = a; //正确,555
做右值时,数组名a表示数组的首元素首地址,因此可以直接赋值给指针,等价于&a[0],而&a表示数组首地址。
注1.:数组首元素的首地址和数组的首地址是不同的,虽然数值上一样,但意义上不一样,前者p = &a[0]或p=a是数组元素的地址而后者p = &a是数组整体的地址。
注2:a不能做左值进行赋值,因为数组名a是个常量,固定了的地址。
(2)指针的一次?访问:*p *(p+1) *(p+2) *(p+3)
14.什么是结构体?如何定义结构体?结构体初始化方式?
(1)结构体中可以包含多种类型不同的元素,是一种数据封装的方法,结构体中的元素一般是有关系的。
(2)①定义结构体类型struct②定义结构体变量s1③使用变量.name.num.isMale
(3)完全初始化
可以部分初始化
15.共用体(union,联合,联合体)
在定义和使用形式上除了关键字union,和结构体struct很相似,但两种数据结构是完全不同的东西。结构体,是多个数据的组合。共用体,是一个东西被好几个名字(和类型)共用。共用体一般用于多选一。
(1)共用体的使用
(2)结构体和共用体的结合使用
16.我认为宏定义常用于公式的计算。宏名常大写。宏定义的后面常用括号括起来。
17.枚举enum和宏定义类似,常用于把相关的一些变量归类。
18.C语言进阶——基本数据类型
数据类型分为2类:基本数据类型:char short int long float double;复合类型:数组、结构体、共用体、类(C++)。
(1)内存占用与sizeof运算符
对于32位CPU,char(1字节)、short(2字节)、int(4字节)、long(4字节)、float(4字节)、double(8字节)
(2)有符号数和无符号数
对于char short int long,都有有符号数和无符号数;对于float double,只有有符号数。
例:unsigned int无符号数,32位(4字节)全部用来存数,范围是0 - 4294967295(2^32 - 1)
(signed) int有符号数,32位中最高位表示符号位,范围是-2147483648 (2^32)- 2147483647(2^31 - 1)
注:对于float和double,存储方式和整型数完全不一样,因此存取的时候数据类型要相同,否则会发生错误,而char作为一种比较小的整型,只有在其比较小的范围内存储才不会发生错误,short也一样。
19.C语言进阶——空类型
C语言中的void类型,代表任意来下,而不是空的意思。任意的意思是未知的,暂时未指定的。函数的形参列表为void表示调用时不需要给他传参;返回值类型是void表示这个函数不会返回一个有意义的返回值。
void *是void类型的指针。void类型的指针的含义是:这是一个指针变量,该指针向一个void类型的数。void类型的数就是说这个数有可能是int,也有可能是float,也有可能是个结构体,哪种类型都有可能,只是我当前不知道。
void型指针的作用就是,程序不知道那个变量的类型,但是程序员自己心里知道。程序员如何知道?当时给这个变量赋值的时候是什么类型,现在取的时候就还是什么类型。这些类型对不对,能否兼容,完全由程序员自己负责。编译器看到void就没法帮你做类型检查了。
20.C语言进阶——数据类型转换
C语言中不同类型的变量不能直接加减运算,必须要转换成相同的类型才能运算。转换分为隐式转换和强制类型转换。
(1)隐式转换
隐式类型转换默认朝精度更高、范围更大的地方转换。
(2)强制类型转换
用(int)放在变量前面进行强制转换。
21.bool类型
C语言中原生类型没有bool,C++中有。在很多代码中,用宏定义来定义bool类型。
#define TRUE 1
#define FALSE 0
在C语言中可以用int来代替。除了0其他都表示真,0表示假。
22.局部变量、全局变量比较
(1)如果没有初始化,局部变量的值是随机的,全局变量的值默认为0.
(2)局部变量定义有作用域,即在该{}括起来的部分。
(3)全局变量分配在数据段上,局部变量分配在栈中(代码段存的是程序代码)
23.静态局部变量
静态局部变量所在函数被多次调用时,只有第一次经历定义和初始化,以后只维持之前调用执行后的变量值(函数退出时变量不会死亡)。静态局部变量和全局变量类似,不同点是作用域不同。
注:普通局部变量定义auto int i = 0或int i = 0;静态局部变量定义static int i = 0。(register int i = 0为寄存器形式的局部变量,表现上和auto是一样的,基本上没什么用,被称为C语言中最快的变量,因为变量被放到寄存器中而不是内存中。但是register变量不能定义太多,并且数据类型有限制,比如不能定义double。一般只在内核或者启动代码中,需要反复使用同一个变量的情况下才会使用register类型变量)
24.静态全局变量
在定义前加static,告诉编译器这个变量只在本文件使用,可以防止重名问题。
25.多文件项目中,跨文件调用函数
在调用函数前,要先声明该被调用函数的原型。
26.多文件项目中,跨文件的变量引用
在a.c文件里定义的全局变量在b.c文件里不能直接使用。
(1)可以通过间接调用a.c文件里的函数来使用a.c文件里的全局变量。
(2)也可以通过在b.c中进行变量的声明 extern int g_a
注:局部变量不能跨文件使用。
27.const关键字
const int i = 14;定义了后i就不能再赋值了
const和指针结合的4种形式:
const int *p:p是一个指针,指针指向一个int型数据。p所指向的是个常量
int const *p:p是一个指针,指针指向一个int型数据。p所指向的是个常量。
int *const p:p是一个指针,指针指向一个int型数据。p本身是常量,p所指向的是个变量。
const int *const p:p是一个指针,指针指向一个int型数据。p本身是常量,指向的也是常量。
28.头文件
(1)为什么需要头文件?
头文件可以避免在庞大的项目中对于同一批函数的多次声明。
(2)#include包含头文件时,<>和“”的区别。
<>用来包含系统自带的头文件,是编译器、库函数、或者操作系统提供的头文件。
“”用来包含项目目录中的头文件,这些一般是自己写的。
(3)防止重复包含头文件
#ifndef A_H
#define A_H
//C语言头文件中的声明
#endif
(4)最好不要在头文件中定义变量。因为这时该头文件被多个源文件包含时,就会出现重复定义问题。全局变量的定义应放在某个源文件中,在别的源文件用extern去声明。
朱有鹏老师嵌入式linux基础预科——学习笔记