学习嵌入式的第二步当然是学会C语言
一、输入输出
标准输入一般指的是键盘的设备文件, 从键盘获取数据就成为标准输入
如果以后需要从标准输入中获取数据得到乱码或未知数据,则可以尝试使用getchar进行清空再 获取。
| 标准 | 对应符号 | 作用 |
|---|---|---|
| 标准输入 | stdin | 对应的是键盘文件 |
| 标准输出 | stdout | 对应的是终端《带缓冲区》(屏幕) |
| 标准出错 | stderr | 对应的是终端《无缓冲区》(屏幕) |
c
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("hello Ubuntu!");
//把 hello Ubuntu 输出到 标准输出文件里(需要缓冲)
return 0;
}
c
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("hello Ubuntu!");
//把 hello Ubuntu 输出到 标准输出文件里(需要缓冲)
printf("hello C\n");
//把 hello C 输出到 标准输出文件里 遇到\n就会刷新缓冲区
return 0;
}
标准输出文件中默认使用缓冲 ,也就是当遇到 \n 的时候会进行刷新缓冲区(把数据输出)
当打印语句后面没有换行符时 , 需要等待缓冲区被装满或者被别的语句刷新或则程序正常退出
c
#include<stdio.h>
int main(int argc, char const *argv[])
{
int num = 0;
char c = '0';
// & 取地址符号 , 获得 内存 num 的地址
int ret_val = scanf("%d", &num );
while(getchar() != '\n'); // 清空 由 scanf 所留在缓冲区的内容
// 如果不清空有可能会导致下一次使用标准输入缓冲区异常(有上一次的数据没有被读取)
printf("返回值:%d , 获取的数据为:%d\n" , ret_val , num );
ret_val = scanf("%c", &c );
while(getchar() != '\n'); // 清空 由 scanf 所留在缓冲区的内容
printf("返回值:%d , 获取的数据为:%c\n" , ret_val , c );
printf("EOF:%d\n" , EOF); //EOF 实际上是一个值为‐1 的宏
return 0;
}
调试技巧
c
//调试技巧
printf("%s--%s--%d\n",__FILE__,__FUNCTION__,__LINE__);
//__FILE__:文件名
//__FUNCTION__:方法名
//__LINE__:当前行数
编译技巧
c
gcc Hello.c // 使用gcc 编译 Hello.c 并且默认生成一个名为 a.out的可执行文件
gcc Hello.c ‐o NOHELLO // 使用gcc 编译
// Hello.c 并且指定生成名字为NOHELLO 的可执行文件
gcc Hello.c ‐o NOHELLO ‐v // ‐v 输出编译的信息, 包括头文件寻找的路径
gcc Hello.c ‐o NOHELLO ‐I/mnt/d/ ‐v // ‐I 指定头文件寻找的路径(在原本默认的基础上添加)
gcc Hello.c ‐Wall // 输出所有的警告
二、整型
int是表示整数类型的数据
c
int a = 123;
/*
1、先向系统申请一块内存,4字节,名字为a
2、把12转化为二进制并存入内存中
*/
取值范围:

shell
getconf INT_MAX
getconf INT_MIN
整型的修饰符
| 修饰符 | 作用 |
|---|---|
| short 短整型 | 用于修饰整型的尺寸变为原本的一半,减少内存的开支,缩小取值范围 |
| long 长整型 | 用于修饰整型的尺寸使其尺寸变大(取决与系统), 增加内存开支, 扩大取值范围 |
| long long 长长整型 | 用于修饰整型的尺寸使其尺寸变大(取决与系统), 增加内存开支, 扩大取值范围 (在64位系统中 long 与 long long的大小一致) |
| unsigned 无符号整型 | 用来修饰整型并去掉符号位,使得整型数据没有负数,可以提正整数的取值范围 (0 - 4294967295) |
整数的存储方式
原码:正整数是直接用原码进行存储,直接把正整数转化为二进制进行存储
补码:负数则是使用补码来存储;补码=原码的绝对值 取反+1
取反加1时符号位不变
溢出:当超过取值范围时则会变成相邻的最大值\最小值
整型输出
c
#include <stdio.h>
//头文件
int main(int argc, char const *argv[])
{
//int型
int a = 100;
/*
1、先向系统申请一块内存,4字节,名字为a
2、把100转化为二进制并存入内存中
*/
//INT的最大值是2147483647
printf("%d\n",__INT_MAX__);
//INT的最小数值是-2147483648
//输出
printf("十六进制:%#x\n",a);
printf("十进制:%d\n" , a );
printf("八进制:%#o\n" , a );
return 0;
}

sizeof运算符
这里推荐到这个博主:
https://blog.csdn.net/zhouml_msn/article/details/103361539
三、浮点型
浮点是用来表达一个实数的数据类型。
分类有:
- 单精度浮点型 float , 典型尺寸 4 字节
- 双精度浮点型 double , 典型尺寸 8 字节
- 长双精度 long double , 典型尺寸 16 字节

c
char k = 'K';
/*
1、申请一片内存并命名为k
2、把字符'K'的ASCII码值转换为二进制,并存储到该内存中
3、计算机中存储的所有数据都是以二进制的形式存在的, 因此字符必须映射某一个数字才能
够被存放到计算机中,这个映射的表就成为 ASCII 表,可以使用man手册来查看
*/
man ascii

c
char c = '1' ;
printf("字符:%c\n",c); // 以字符的形式来解析内存 c 的内容得到 对应的字符 1
printf("整型ASCII值:%d\n",c); //以十进制整型来解析内存c 的内容 ,得到1多对应
的ASCII值
四、字符串
字符串的表现形式有两种:
- 数组(可读 ,可写):(存储)
- 指针
c
char s1 [] = "Hello" ; //使用一个数组来存放字符串 "Hello"
c
char * s2 = "Even"; // 使用一个指针来指向常量字符串
五、布尔类型
布尔类型用来表示真/假 (非零则真)
注意在使用布尔类型是需要包含他的头文件: <stdbool.h>
c
bool a = true ;
printf("sizeof(bool):%ld \n ",sizeof(bool) );
printf("sizeof(a):%ld \n ",sizeof(a) );
printf("sizeof(true):%ld \n ",sizeof(true) );
printf("sizeof(false):%ld \n ",sizeof(false) );
printf("false:%d \n ",false );
printf("true:%d \n ",true );