已经学习两天了,把前两天的内容难点总结一下,巩固知识
1.头文件<stdio.h>的含义
standard input and output 标准输入输出
2.局部变量和全局变量
作用域:局部变量变量所在的局部范围起作用,全局变量时整个工程文件
生命周期:局部变量在进入该作用域 生命周期开始 ,出作用域生命周期结束
,全局变量生命周期是整个程序运行时的生命周期。
3.常属性修饰const
const修饰的常变量不可修改,如const int a=5; a= 6;会报错
4.枚举常量 enum
枚举就是一一列举的意思
enum SEX
{
MALE,
FAMALE
};
注意 枚举常量 是不可修改的!但是枚举定义的变量可以修改。 如:enum Sex sex=MALE; sex=FEMALE;
5.字符串
char arr1[]="abc";
char arr2[]={'a','b','c'};
printf("%s\n",arr1)
printf("%s\n",arr2)
此时打印arr2 会出现一大串随机字符才结束打印,原因时arr1 字符串打印“abc” 真实情况时
'a','b','c'\0 会默认放\0 来表示时 字符串 的结束,而arr2 打印字符串的时候,printf会想寻找\0,直到遇到\0才会结束
6.字符串长度
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
char arr3[] = { 'a','b','c','\0'};
printf("%d\n", strlen(arr3));
打印arr2输出是随机值,是因为 arr2数组后面没有\0 一直会找下去直到找到\0。
7.转义字符
6.1//转变原意
??+任意字符 会被解析完三字母词,当你想打印一连串??????时 ,为了不被编译位三字母词 需要加入\?来实现 ?的打印
\n 换行符 \t 水平制表符 \\ 防止后面的\被解析为转义字符
6.2转义字符面试题
printf(“%d\n”,strlen("c:\text\32\test.c"))
请问输出值
答案:13
原因:\t 被认为转义字符 算一位长度,\ddd(ddd 代表1-3个 八进制数)
其中的\32 就被转换成了 十进制ASCII码对应的字符 ,所以被算作一位
8.三目操作符
(表达式?a:b)如果表达式是真 ,则返回a,否则返回b,
9.原码反码补码
原码:最高位存放符号位,其他位存放该二进制的绝对值。
反码:正数的反码就是原码,不变。负数的原码 除去符号位,其他按位取反
补码:正数的补码 就是原码,不变。负数的补码等于反码+1。
原码简单易懂,但是负数参与加减运算时,会出现莫名错误。
10.常见关键字(我不常见的关键字)
register
*register int a =0;只是建议a定义为寄存器变量 ,建议!
typedef 类型重定义
typedef unsigned int u_int;
static
10.1 static修饰局部变量
局部变量生命周期变长,变成整个程序的生命周期
10.2 static修饰全局变量
全局变量此时只能在 自己的源文件使用,其他文件不可调用,即使extern也不行
10.3static修饰函数
改变了函数的链接属性,从外部连接 改变到 内部链接,即是能在本文件调用。
11.指针
11.1指针就是门牌号(地址),指针变量 存放的是 内存地址。
11.2如何产生地址
32位/64位电脑 分别由32跟/64跟地址线,每根地址线都有0/1之分,32根地址线就有了2
的32次方个编号,每个编号 都会被分配给 一个个内存空间,每个内存空间 存储量是 一个字
节即8bit.
32位的电脑的一个指针变量 因为要存放32bit的地址,所以指针变量的大小就是4个字节
64位则是8个字节;
11.3 指针,解引用 ,取地址
&a; // 代表取a的地址
int *p= &a; //整型类的指针 ,将a的地址 存放到指针变量中
*p =1;//解引用操作 ,即通过指针变量p 来找到a的内存编号 来直接改写
12.结构体//stm32标准库 初始化结构体 就是这么来的
struct BOOK
{
char name[20];
short price;
};
struct BOOK b1={"嵌入式入门",66}
printf("书名:%s\n", b1.name);
printf("价格:%d元\n", b1.price);