嵌入式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关键字在本文件对其声明。即可使用。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值