第17 ~19天 串讲...
1.int main(int argc,char const*argv[]);参数可以是void,或者是int argc,char const *argv[]命令行参数argc表示传递了几个参数argv表示参数的内容。2.内存中的数据内存单位 字节3.字节序大端字节序低地址存高位高地址存低位小端字节序低地址存低位高地址存高位4.存储栈区 //存放临时变量(由内核创建和释放)先进后出后进先出堆区 //动态分配内存 malloc,calloc realloc函数,手动释放free()静态区 //变量的生明周期和整个进程一样只初始化1次.bss 未初始化.data 已初始化常量区.rodata 数据不可修改代码区 存放函数cpu指令常量不可变化的数据只读类型语法一般是大写宏常量 #define 常量名 常量字符串常量 const char*pworld;数值常量 const int A10; //a是常量不在常量区const static int B20; //b是常量在常量区 .rodata一般推荐用数值常量代替宏常量段错误内存引发的程序崩溃 运行阶段程序试图访问不属于它的内存地址时操作系统触发的错误。结果程序崩溃通常输出Segmentation fault (core dumped)。register:寄存器存储运行速度快但寄存器数量少不一定申请成功static用法1.修饰局部变量 将变量存放在静态区延长生命周期2.修饰全局变量 修改变量作用域只能在当前文件使用不能跨文件使用3.修饰全局函数 修改全局作用域只能在当前文件使用不能跨文件使用指针ynaint a10;int *pa; //p是指针*p20 //解引用 [] 等价于*指针偏移 *(p1)-指针加法int a10; //假设a的地址是0x1000ynaint *pa;//p0x1000pp1; //0x1004 指针的加法加的是指针指向的类型的大小int arr[5] //假设arr的地址是0x2000//arr数组名》指向数组的第一个元素的地址 int *int *parr1; //0x2004//arr代表数组的首地址数组的首地址和数组第一个元素的地址相同 int(*)[5]qarr1; //0x2014strcpy函数 拷贝字符串dest 拷贝完后的字符串 src 被拷贝的字符串 char *strcpy(char *dest, const char *src);将src指向的字符串包括\0拷贝到dest返回dest指针可能会缓冲区溢出标准strcpy不要求处理内存重叠。原因性能考虑检查重叠需要额外的开销,strcpy追求速度历史设计strcpy明确要求 dest 和 src 不重叠违反此要求是调用者的错误职责分离处理重叠是memmove的职责original是一个临时变量用来保存dest的原始地址。Buffer缓冲区是一块连续的内存空间用于临时存储数据。5.大小端6.掩码掩码Mask是位操作中用来选择性地操作特定位的一个二进制数。它就像一个“数字模板”通过和原始数据进行位运算与、或、异或等可以只影响指定的位而不改变其他位。#define BIT_MASK(n) (1u (n))第 n 位掩码 2ⁿ即只有第 n 位为 1其余位全部为 0 的二进制数。指针传递和值传递的区别指针传递是把变量的地址传递给函数函数直接修改变量按值传递是把变量的值复制然后再传给函数不会影响原变量的值结构体数组结构体数组是将结构体类型作为元素的数据集合可以存储多个结构体实例。定义结构体数组时可以指定数组大小或动态分配空间。在使用结构体数组时可以通过索引访问数组中的各个结构体元素。结构体指针结构体指针是指向结构体类型的指针变量使用结构体指针可以通过-操作符访问结构体的成员。结构体指针用于动态分配结构体内存时能够方便地操作结构体成员。野指针未初始化或动态分布内存后释放后的指针指向地址随机避免使用野指针的方法包括初始化指针变量、避免使用已释放的指针、使用NULL来指示指针无效等。inline关键字用来建议编译器将函数内联展开而不是进行函数调用。普通函数调用 main() → 跳转到 set_bit() → 执行 → 跳回 main() ↑ │ └────────── 函数调用开销 ────────────┘ 内联展开 main() 中直接插入 set_bit 的代码 *reg | (1u n); ← 没有跳转直接执行减少函数调用常量指针和指针常量常量指针指向常量的指针指针可以修改指向的内容不可修改const int *p指针常量指针不可修改指向的内容可修改int *const p数组指针和指针数组数组指针是指针指向数组int (*p)[10]指针数组是数组数组内元素是指针int *p[10]函数指针和指针函数指针函数是函数返回类型是指针int *func(int a)函数指针是指针指向函数int (*p)(int a)