#include <iostream> #include <cstring> using namespace std; int main() { const char a[] = "你好", *s = a; cout << sizeof(a) << ' ' << sizeof(s) << ' ' << sizeof(*s) << ' ' << strlen(s) << endl; } 的输出结果是什么
时间: 2025-09-09 18:48:59 AIGC 浏览: 12
### C++ 中 `sizeof` 和 `strlen` 对数组和指针的操作结果解析
在 C++ 中,`sizeof` 运算符用于计算变量或类型的字节大小,而 `strlen` 函数则用于测量以 `\0` 结束的字符串的实际长度。两者的用途不同,因此在处理数组和指针时会有不同的表现。
---
#### **1. 数组的情况**
当定义一个字符数组时,例如:
```cpp
char str[] = "hello";
```
- **`sizeof(str)`**: 计算的是整个数组分配的内存大小,包括字符串内容及其末尾的 `\0` 字符。因此,`sizeof(str)` 的值为 6(5 个字母加上 1 个 `\0`)[^3]。
- **`sizeof(str[0])` 或 `sizeof(*str)`**: 表示单个字符的大小,通常为 1 字节。
- **`strlen(str)`**: 测量从字符串开头到第一个 `\0` 之间的有效字符数,不包括 `\0` 自身。因此,`strlen(str)` 的值为 5。
以下是完整的代码演示:
```cpp
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
printf("sizeof(str) = %zu\n", sizeof(str)); // 输出 6
printf("sizeof(str[0]) = %zu\n", sizeof(str[0])); // 输出 1
printf("strlen(str) = %zu\n", strlen(str)); // 输出 5
return 0;
}
```
---
#### **2. 指针的情况**
如果使用指针指向同一个字符串,则结果有所不同:
```cpp
const char *p = "hello";
```
- **`sizeof(p)`**: 计算的是指针本身的大小,取决于系统的架构(通常是 4 字节或 8 字节)。
- **`strlen(p)`**: 同样是从字符串开头到第一个 `\0` 的有效字符数,仍然为 5。
- **注意**: 如果尝试访问 `sizeof(*p)`,它表示指针所指向的第一个字符的大小,仍然是 1 字节。
下面是对应的代码片段:
```cpp
#include <stdio.h>
#include <string.h>
int main() {
const char *p = "hello";
printf("sizeof(p) = %zu\n", sizeof(p)); // 输出 4 或 8
printf("sizeof(*p) = %zu\n", sizeof(*p)); // 输出 1
printf("strlen(p) = %zu\n", strlen(p)); // 输出 5
return 0;
}
```
---
#### **3. 组合情况分析**
考虑更复杂的组合场景,如下所示:
```cpp
char arr[] = "abcdef"; // 定义了一个包含 '\0' 的字符数组
printf("%zu\n", sizeof(arr)); // 输出 7 (6 个字符 + 1 个 '\0')
printf("%zu\n", sizeof(arr + 0)); // 输出 4 或 8 (指针大小)
printf("%zu\n", sizeof(*arr)); // 输出 1 (单个字符大小)
printf("%zu\n", sizeof(&arr)); // 输出 4 或 8 (数组地址大小)
printf("%zu\n", sizeof(&arr + 1)); // 输出 4 或 8 (指针偏移后的地址大小)
printf("%zu\n", sizeof(&arr[0] + 1)); // 输出 4 或 8 (单个元素地址偏移后的大小)
printf("%zu\n", strlen(arr)); // 输出 6 (有效字符数)
printf("%zu\n", strlen(&arr)); // 输出 6 (同上)
printf("%zu\n", strlen(&arr + 1)); // 不确定值(非法操作)
printf("%zu\n", strlen(&arr[0] + 1)); // 输出 5 (跳过首字符后剩余部分的有效字符数)
```
##### 解释:
- **`sizeof(arr)`**: 整个数组的大小,包括 `\0`。
- **`sizeof(arr + 0)`**: 当数组名被用作表达式的右值时,退化为指针,因此返回指针大小。
- **`sizeof(*arr)`**: 单个字符的大小。
- **`strlen(arr)`**: 有效字符数,不包括 `\0`。
- **`strlen(&arr + 1)`**: 非法操作,因为 `&arr + 1` 超出了原数组范围。
- **`strlen(&arr[0] + 1)`**: 从第二个字符开始计数的有效字符数。
---
#### **总结表格**
| 表达式 | 描述 | 示例 (`char arr[] = "abcde\0"`) |
|-----------------------|----------------------------------------|-------------------------------|
| `sizeof(arr)` | 数组总大小 | 6 |
| `sizeof(*arr)` | 单个字符大小 | 1 |
| `sizeof(arr + 0)` | 指针大小 | 4/8 |
| `strlen(arr)` | 有效字符数 | 5 |
| `strlen(&arr[0] + 1)` | 从第 2 个字符开始的有效字符数 | 4 |
---
###
阅读全文
相关推荐

















