一、sizeof 和 strlen 的对比
1.sizeof
sizeof 计算变量所占内存空间大小的,单位是字节,如果操作数是变量类型的话,计算的是使用类型创建变量所占内存空间的大小
sizeof 只关注占用内存空间的大小,不在乎内存中存放什么数据
2.strlen
strlen 是C语言库函数,功能是求字符串长度,必须要包含头文件:#include <string.h>
统计的是 \0 之前字符串的个数
strlen 函数会一直向后找 \0 字符, 知道找到为止,所以可能会存在越界查找
3.sizeof 和 strlen 的对比
| 项目 | sizeof | strlen |
|---|---|---|
| 本质 | 运算符 | 库函数 |
| 作用 | 计算占用内存字节大小 | 统计字符串有效字符数量 |
是否包含\0 | 包含字符串末尾\0 | 不包含\0 |
| 求值时间 | 大多编译期间算出 | 运行时,循环遍历内存 |
| 参数 | 类型 / 变量 / 数组名 | 必须是以\0结尾的 char * 字符串 |
无\0情况 | 正常计算,不会越界 | 内存越界,结果随机(UB 未定义行为) |
| 返回类型 | size_t(无符号整型) | size_t(无符号整型) |
| 打印格式推荐 | %zu | %zu |
二、数组和指针笔试题
知识点回顾:
数组名的意义:
1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩。
2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表⽰⾸元素的地址。
代码1:(一维数组)
代码2:(字符数组)![]()
代码3:
代码4:
代码5:
代码6:
代码7:
代码8:(二维数组)
三、指针运算笔试题
代码1:
代码2:
代码3:
代码4:
tip:
指针 - 指针的前提是两个指针指向同一块空间
指针 - 指针得到的是两个指针之间的元素个数
(小地址- 大地址会得到负数)
补充:
规则:
1.最高位是符号位,剩下是数值位
2.正数:符号位 = 0
3.负数:符号位 = 1,后面写该数绝对值的二进制
已知十进制真值 → 写出原码(8 位举例)
例 1:+5,8 位
5 的绝对值二进制:101,补齐 7 个数值位:0000101符号位 0 原码:0 0000101
例 2:-5,8 位
绝对值是 5,二进制0000101符号位改成 1 原码:1 0000101
正数:原码 = 反码 = 补码,不用变! 只有负数才需要转换。
负数:原码 → 补码
两步法:
1.原码符号位不变,其余各位按位取反,得到反码
2.反码+1→ 得到补码
口诀:符号不动,其余取反,再加 1
ex:-5,8bit
真值:-5
原码:1 0000101
反码:1 1111010(符号不变,数值位取反)
补码:1 1111011(反码 + 1)
把这个 32 位补码写成十六进制,每 4 位一组:1111 1111 1111 1111 1111 1111 1111 1100F F F F F F F C->0xFFFFFFFC