摘要:
两个结构体赋值时,如果存在指针成员,这时候复制了指针的值,而不是指针目标的值,称为浅拷贝。函数调用传递结构体而不是结构体指针时,隐含浅拷贝,这点需要注意。 避免两个结构体中的指针成员引用同一资源的方法: 1.如果有条件,让每个结构体变量中的指针成员各自拥有独立的资源(深拷贝)。 2.引用计数,所有结 阅读全文
摘要:
设计结构体的数据成员时,容易改变的成员要谨慎考虑,是否要设计为成员。 空结构体占用1字节。空结构体常用来表示十分抽象的事物,抽象到没有数据。为了允许代码获取空结构体变量的地址,所以要给它分配空间。 成员变量内存对齐的原则: vs的编译选项里可以设置对齐,默认为8字节对齐,/Zp8 设编译对齐值为Zp 阅读全文
摘要:
指针的指针:指向指针的指针 const char *names[] = { "C", "C++", "C#", "Java", }; //数组名是指向数组首元素的指针 const char **p = names; const char *(*q)[4] = &names; 【数组名】是指向【数组第 阅读全文
摘要:
指针数组:组成元素是指针的数组。 数组指针:指向数组的指针。 //变长字符串数组,保存每个字符串的首地址,字符串内容保存在只读区 //结合指针作为数组的元素,即可使得存储更紧凑,有可以带来访问优势 const char *pszBuff[] = { "wqerasdf", "wqe4f", "wqw 阅读全文
摘要:
一、指针函数:返回指针的函数 注意事项: 1.不应该返回参数的地址: 如果返回的指针保存了参数的地址,则当函数调用完成后,返回的指针引用了一个栈 外地址,函数调用完成后参数会被释放。此地址会被新的函数占用并修改。 2.不应该返回局部变量的地址: 如果返回的指针保存了局部变量的地址,则当函数调用完成后 阅读全文
摘要:
任何时候指针只能有两种状态,NULL状态和正常状态。 仅仅给出地址,计算机无法正确有效地读写数据。 指针是一个具有解释方式信息的地址 分析指针时关心两件事: 1.在哪里 2.是什么 理解了指针的解释方式,就可以任意解释内存中的数据 举例: unsigned char *p = NULL; int n 阅读全文
摘要:
问题起因:别的文件定义了宏或函数等,我们现在想利用这些已经写好的代码,如果直接#include "xxx.cpp",会重复定义。因此需要定义一些规范,方便管理以及避免编译错误。 规范: 1.任何产生处理器行为(编译为二进制代码)的代码,都在.c .pp这些源码文件中定义。 2.不产生处理器行为的代码 阅读全文
摘要:
一、vs2019添加新的配置, vs2019里搜索/p可找到选项“预处理到文件”,选择是,可以查看生成的预处理文件。 二、宏 预处理指令用于程序员和编译器之前的交互。 宏的处理机制:文本的查找替换。 宏的作用: 1.符号化常量,让数值或其他类型的常量更有说明性意义: #define PI 3.14 阅读全文
摘要:
静态全局变量和静态局部变量的探索 一、静态全局变量 1.特点 静态全局变量具有文件作用域,生命期是所处模块装载到所处模块卸载,处于同一文件中的代码能直接访问它,外部文件不能直接访问。假设写了如下代码,编译通过。 现在在同一工程下新建文件,输入如下代码,编译通过,链接失败。 如果换成全局变量,则编译连 阅读全文
摘要:
char szBuff[10] = { 0 }; scanf("%9s", szBuff);//最多读9个字符,防止溢出 全局变量尽可能不用 code read execute 全局、静态 data init read write read only 常量,const生命的全局变量,字符串常量 un 阅读全文