主要参考:2023最新嵌入式学习路线! (qq.com)
0.常见其余问题
1.指针:一级/二级指针,指针数组,数组指针,指针函数,函数指针
2.数组:一维/二维数组 排序等
3.字符串
4.关键字:#define assert const const static volatile extern sizeof typedef等
5.函数:strlen strcmp strstr memcpy sprintf等
6.内存:堆栈,内存分配 malloc/free 大小端
7.变量:变量类型/占用字节数,局部/全局/静态变量,形参/实参
8.结构:结构体 联合体,枚举
=====================
0.
C语言结构体中"->" 和"."的区别
①若定义的结构体变量,则访问数据时用".";
②若定义的结构体指针,则访问数据时用"->";
typedef struct{ //定义一个结构体,类似于C++里面定义一个类
int data;
}Structure_V1;
//下面类似于C++里面定义两个对象
Structure_V1 aaa; //定义结构体变量:aaa
Structure_V1 *paaa; //定义结构体指针:paaa
下面是访问数时的用法:
aaa.data=0; //定义的结构体变量,访问数据时用"."
paaa->data=1; //定义的结构体指针,访问数据时用"->"
个人理解:
".":正常定义结构体,访问成员时使用
"->":指针指向
1累加到100
复合算术赋值 “+=”
int num=0;
for (int i=0;i<=100;++i)
{
sum += i;
}
4.
关键字:#define
#define又称宏定义,标识符为所定义的宏名,简称宏。
#define 的功能是将标识符定义为其后的常量。
使用宏定义可以用宏代替一个在程序中经常使用的常量。注意,是“经常”使用的。这样,当需要改变这个常量的值时,就不需要对整个程序一个一个进行修改,只需修改宏定义中的常量即可。且当常量比较长时,使用宏就可以用较短的有意义的标识符来代替它,这样编程的时候就会更方便,不容易出错。因此,宏定义的优点就是方便和易于维护。
需要注意的是,预处理指令不是语句,所以后面不能加分号。
# include <stdio.h>
# define NUM 5
int main(void)
{
int i, j = NUM;
int a[NUM] = {0};
printf("请输入%d个数:", j);
for (i=0; i<NUM; ++i)
{
scanf("%d", &a[i] );
}
for (i=0; i<NUM; ++i)
{
printf("%d\x20", a[i]);
}
printf("\n");
return 0;
}
输出结果是:
请输入5个数:5 4 3 2 1
5 4 3 2 1
5.
函数:strlen
strlen() 函数从字符串的开头位置依次向后计数,直到遇见 “ \0
”,然后返回计时器的值。最终统计的字符串长度不包括 “ \0
”。
/*strlen*/
char str[] = "ABCD";
printf("str sizeof is %d\n",sizeof(str));
printf("str strlen is %d\n", strlen(str));
Printf实现
void Serial_Printf(char *format, ...)
{
char String[100];
va_list arg;
va_start(arg, format);
vsprintf(String, format, arg);
va_end(arg);
Serial_SendString(String);
}
void Serial_Printf(char *format, ...) 参数1:开辟一个字符空间;参数2:... 可变参数列表
char String[100]; 首先定必输出的字符串
va_list arg; 定义一个参数列表变量(对应可变参数列表)
va_start(arg, format); 从fommat位置开始接收参数表,放在arg里面
sprintf(String, format, arg); 打印位置是String,格式化字符丰是fomat,参数表是arg
va_end(arg); 之后,va_end(arg),释放参数表
Serial_SendString(String); 就是Serial Sendstring,把String发送出去
9.
int *const p(char *p const) 与 int const* p(const int *p) 的区别
int * const p:const 修饰 p , 指针变量 p 不可修改,但其内容 *p 可以修改
int const *p:const 修改 *p ,其内容 *p 不可以修改,但指针变量 p 可以修改