C 语言学习日记・数据类型与结构体篇
C 语言学习日记・数据类型与结构体篇一、整型数据与溢出1\. 取值范围2\. 溢出现象二、const 常量修饰三、结构体与 typedef1\. 结构体基础2\. typedef 简化类型名四、结构体初始化五、结构体成员访问1\. 普通结构体变量点运算符 .2\. 结构体指针两种访问写法六、常用格式符汇总七、易错踩坑清单一、整型数据与溢出1. 取值范围32 位int范围-2^31 ~ 2^31-1-2147483648 ~ 214748364764 位long long范围-2^63 ~ 2^63-1最多正确计算 20 的阶乘2. 溢出现象整数溢出属于 C 语言未定义行为数值会发生截断错乱。例如计算 100! 时持续累乘后二进制低位全部变为 0最终输出结果为 0。解决方案小范围用long long超大数必须用数组模拟高精度乘法。二、const 常量修饰const修饰的变量为只读变量定义后不可修改constintnumber10;// number 20; // ❌ 编译报错只读变量不可修改常用来定义数组长度、固定参数提高代码可读性和安全性。三、结构体与 typedef1. 结构体基础结构体可以把多个不同类型的数据打包成一个整体// 定义结构体类型structperson{intnum;charname[10];};// 初始化与访问structpersonp{20,yxyh};p.num21;// 用.访问成员2. typedef 简化类型名用typedef可以给结构体起别名后续定义变量更简洁typedefstruct{intlead;intdata[100];}Data;Data h{19,{1,2,3}};// 直接用Data定义变量h.data[1]10;// 结构体数组成员结构体变量.数组成员[下标]四、结构体初始化按照成员定义的顺序用大括号批量赋值// 普通结构体初始化structpersonp{20,cyx};// 包含数组成员的结构体嵌套大括号初始化数组Data h{19,{1,2,3}};初始化顺序必须和结构体成员的声明顺序一一对应只初始化部分成员时剩余成员自动初始化为 0五、结构体成员访问1. 普通结构体变量点运算符.Data h{19,{1,2,3}};h.lead20;// 修改普通成员h.data[1]10;// 修改数组型成员变量名.数组名[下标]结构体变量直接用.访问内部成员若成员是数组再通过[下标]访问数组的具体元素2. 结构体指针两种访问写法当用指针指向结构体时有两种等价的访问方式Data h{19,{1,2,3}};Data*hi;hih;// 指针指向结构体变量地址写法 1解引用 点运算符必须加括号printf(%d\n,(*hi).data[2]);括号不能省略.的优先级高于*不加括号会先执行hi.data引发错误逻辑先对指针解引用得到结构体本身再用.访问成员写法 2箭头运算符-推荐最常用printf(%d\n,hi-data[2]);-是结构体指针专属的访问运算符等价于(*指针).成员写法更简洁是指针访问结构体成员的标准写法六、常用格式符汇总格式符作用参数要求%d输出 / 输入十进制整数传 int 变量值scanf 需加 %c输出 / 输入单个字符传 char 变量值%s输出 / 输入字符串传字符串首地址不能加 *%p输出内存地址传指针 / 地址%lld输出 long long 类型整数传 long long 变量七、易错踩坑清单相等判断写错if 条件中相等是写成会变成赋值语句引发逻辑错误。结构体成员访问结构体里的数组成员访问时是变量名.数组名[下标]不要写错顺序。类型不匹配字符串只能初始化char数组不能直接赋值给int数组。括号遗漏错误(*p).成员的括号绝对不能省写成*p.member会编译报错。访问符混淆普通结构体变量用.结构体指针用-不可混用。初始化顺序错误初始化值的顺序必须和结构体成员定义顺序一致不能乱序。数组成员初始化遗漏大括号结构体里的数组成员初始化时要用{}单独包裹例如{19, {1,2,3}}。匿名结构体复用问题法一的匿名结构体类型不能在后续代码中再用来定义新变量。
