C语言
一、概述
1.嵌入式开发为什么选择C语言?
操作系统内核开发用的是C语言实现
2.为什么操作系统选择用C语言进行开发?(即C语言的特点)
1) C语言具有出色的移植性,能够在多种不同体系结构的软件平台中实现
2) C语言简洁紧凑,使用灵活的语法机制,并且能够直接访问硬件
3) C语言有很高的运行效率
3.嵌入式开发中的地位——开发工具
1) 面向过程(结构)处理机制:操作具体事务(追究实现原理)
2) 面向对象处理机制:解决宏观事物(追究实现对象)代码的复用性,维护性,扩展性
复用性:功能代码不做修改,直接调用
维护性:代码出错可直接修改
扩展性:加入新功能时,可直接修改
C语言之父:丹尼斯·里奇
C语言标准:K&RC,ANSIC/C89 C99标准 C11标准 【gcc支持C89,部分支持C99】
二、数据结构(基本类型,复合类型)
1.数据结构:数据集合的划分,不同数据类型对CPU的意义是不一样的
① 整型变量 int a;
② 整型指针变量 int *a;
③ 整型指针的指针变量 int **a;
④ 整型数组 int a[10];
⑤ 整型指针数组 int *a[10];
⑥ 整型数组指针变量 int (*a)[10];
⑦ 整型函数指针变量 int (*a)(int);
⑧ 整型函数指针数组 int (*a[10])(int);
⑨ int *(*(*fp1)(int))[10];
fp1:函数指针变量,该函数指针指向一个形参为int,返回值为数组指针,该数组指向一个整型指针数组。
⑩ int *(*(*arr[5])())();
arr:函数指针数组,该函数指针指向一个形参为int,返回值为函数指针的函数,该函数指针指向一个形参为空,返回值为整型指针
11 float (*(*b())[])();
b:指针函数,函数形参为空,返回数组指针,该指针指向一个函数指针数组,该数组元素指向形参为空,返回值为float的函数
12 void *(*c)(char ,int(*)());
C:函数指针变量,指向函数形参为char,函数指针,返回值为void *
13 void **(*d)(int*,char**(*)(char*,char **));
d:函数指针变量,该函数形参为int*,另一形参为函数指针变量,该函数形参为char*和char**,返回值为指向指针的指针变量,原函数返回值为指向指针的指针变量
14 float (*(*e[10])(int *))[5];
e:函数指针数组,该函数指针指向形参为int*,返回值为数组指针,该数组指针指向5个float型
2.强制转化
char<int<float<double
顺序是进行隐式类型转化
3.字节长度
字节:8位 半字:2字节, 字:4字节
数据类型 charshortintlongfloatdoublelong long
字节长度 1244488
sizeof作为一个运算符有两种表示方式:sizeof a :a为变量名
Sizeof (int):int为数据类型
Sizeof与strlen的区别
1 #include <stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 char a[]="hello";
7 printf("sizeof(a)=%d\n",sizeof(a));
8 printf("strlen(a)=%d\n",strlen(a));
9
10 char b[100]="hello";
11 printf("sizeof(b)=%d\n",sizeof(b));
12 printf("strlen(b)=%\n",strlen(b));
13
14 char *c="hello";
15 printf("sizeof(c)=%d\n",sizeof(c));
16 printf("strlen(c)=%d\n",strlen(c));
17
18
19 return 0;
20 }
运行结果
sizeof(a)=6//加上‘\0’
strlen(a)=5
sizeof(b)=100//数组分配100
strlen(b)=5
sizeof(c)=4//指针固定4字节
strlen(c)=5
指针保存地址,地址在32位电脑中为固定长度4字节,所以不管什么类型,所有指针的sizeof都是4。
4.对于char型而言:无符号的取值范围:0~255,有符号的取值范围:-128~127
正数:原码=补码
负数:原码=补码取反+1 补码=原数的绝对值取反+1
常量是有符号的所以~2=%d=-3
有符号和无符号的区别
有符号数和无符号数进行比较运算(==,<,>,<=,>=)时,无符号数隐式转化为有符号数
5.变量与常量
变量的三大特点
1) 变量的数据类型:主要说明变量占内存空间大小如int型
2) 变量的作用域:作用域变量的有效性范围,即变量的使用范围
3) 变量的存储类型:变量在内存中的存储方式
6.全局变量与局部变量的区别:
从作用域看:
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
从分配内存空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。
从初始化角度看
全局变量在没有初始化的时候,默认为零;局部变量在没有初始化时值随机。虽然全局变量默认为0,但是还是定义一下。
7.声明和定义
定义:创建一个变量,为其分配内存空间,并为他取名,一个变量只能定义一次。
声明:告知编译器,变量名已匹配在一块内存上了,但未为其分配内存。
声明的分类:1.定义性声明:既定义又声明2.引用型声明:只声明不定义