嵌入式C语言–基础知识
嵌入式C语言--基础知识
一. 含参数的宏与函数的不同点
1)函数
函数调用时,先求出实参表达式的值,然后带入形参。
函数调用是在程序运行时进行的,分配临时的内存单元;
对函数中的实参和形参都要定义类型,二者的类型数量要求一致;
调用函数只可得到一个返回值;
函数调用不使源程序变长;
函数调用占运行时间(分配单元、保留现场、值传递、返回);
2)宏
使用带参的宏只是进行简单的字符替换。
宏替换则是在预编译时进行的,在展开时不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
宏没有类型检查,宏名无类型,它的参数也无类型,只是一个符号代表,展开时带入指定的字符即可。
调用宏之后可以得到多个结果;
使用宏时,宏替换后源程序增长;
宏替换不占运行时间,只占编译时间;
二. scanf格式化输入的注意事项
输入数据时采用的分隔符应与格式控制中的分隔符一致;
输入数据时可指定宽度,但不可规定精度;输入格式符带有*,表示该数据不赋值
无符号数可用%d、%o、%x格式输入;
用c格式输入字符时,空格、转义字符均为有效字符;
遇空格、回车、Tab键,遇宽度以及非法输入可认为数据输入结束;
三. 指针
英文名pointer,也叫地址,就是内存块的首地址
1)指针变量(地址变量)
指针变量就是存放指针数据的变量
int*p;//p只能存放int类型内存块的地址
所有指针变量都是4字节(32环境)
未赋初值的指针变量禁止使用(访问未初始化的指针的值程序直接崩溃。访问NULL指针的值也会奔溃)
2)指针常见含义
*p的含义:
根据p里面的地址,找对应类型的内存块。
p+n的含义:
• p地址向后偏移n个存储单元,得到一个新地址(在一连续空间中俩个指针相减等于间隔的内存空间个数)
p[n]的含义:
• 表示p地址第n+1个内存块
指针支持的运算有算术运算、自增自减、关系运算、逻辑运算、赋值运算、条件运算(三目)、逗号运算、sizeof关键字、& *
四. 数组
1、数目固定,类型相同,连续存放的一组有序数的集合;
2、C语言规定,数组名就是内存块的首地址,它是一个常量指针;
3、定义数组时,长度应是常量或常量表达式,不能用变量,而在使用时,a[ i ]表示a之后第i+1个内存块;
4、a + n表示a地址后向右偏移n个储存单元得到新的地址,a[ n ]表示a地址后第n + 1个内存块;
5、数组中每个元素都是变量;
6、int a[ 10 ]={1, 2, 3};部分元素赋初值,其余未赋值为0; int a[ 10 ];一个值都不赋,数组元素均为乱值。
五. 数组与指针的区别
数组是一种数据结构,数组名是该数组的首地址,而指针是一个地址。
sizeof测量数组即为所占内存空间的大小
sizeof测量指针在win32为四字节,win64为八字节
六. sizeof关键字
sizeof作用:能测试常量,变量,数组、类型 所占 应占 内存大小的单位字节数
测试字符串 就是字符个数 + 1
printf(“%d”, sizeof(“lovechina”)); 有\0
测试变量 就是变量对照类型分配的空间大小测试数组 就是数组所占的空间大小,元素占的空间 * 数组长度
所有指针变量 所占4字节(32 系统)
七. sizeof关键字与strlen函数的区别
Sizeof:编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度strlen只能测量字符串 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符
八. strcpy和memcpy区别
1.复制的内容不同
strcpy只能复制字符串,
memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2.复制的方法不同
strcpy不需要指定长度,它遇到被复制字符的串结束符"¥0"才结束,如果空间不够,就会引起踩内存。
memcpy则是根据其第3个参数决定复制的长度。
3.用途不同
通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy,由于字符串是以“¥0”结尾的,所以对于在数据中包含“¥0”的数据只能用memcpy。
九. 大小端模式
大端模式:是指数据的高字节保存在内存的低地址中;
小端模式:是指数据的高字节保存在内存的高地址中
有两种方法来获得大小端的信息。一种是指针强转来实现;也可以使用共同体来获得这个信息。
int check _ sys()
{
int a =1;
char * p =( char *)& a ;
return * p ;//0﹣大端 1小端
}
int check_sy ()
{
union Un{
char c ;
int i ;
};
union Un u ={0};
u.i =1;//如果是小端存储,就会把 c 也修改 return u.i;//0﹣大端 1﹣小端
}
十. extern与static区别
1)static
作用于局部变量时: 叫静态局部变量,在函数调用时,只有在该函数第一次调用时才对其分配空间和初始化。在函数调用结束时,不对该变量的内存进行释放,值仍然保留。这也是于自动变量的区别。
作用于全局变量时: 叫静态全局变量。表示该变量是私有的,只能在该文件使用。不能通过extern关键字对其引用。
作用于函数时: 叫静态函数,表示该函数是私有的,只能在本文件中使用,不能通过extern关键字对其引用
2)extern
本文件: 定义在本文件下面的全局变量,想要在上面使用时需要使用extern关键字对其声明
其他文件:定义在其他文件的全局变量想要在本文件使用时,若该变量未被static修饰时可通过extern关键字在本文件对其声明。即可使用。