strlen(p+10) 计算字符串 "Three" 的长度 "Three" 有5个字符 输出:5
C语言程序执行分析
程序代码
#include <stdio.h>
#include <string.h>
void main()
{
char str[][10] = {"One", "Three", "Five"};
*p = str[0];
printf("%s,", p+10);
printf("%d\n", strlen(p+10));
}
逐步分析
1. 变量声明和初始化
char str[][10] = {"One", "Three", "Five"};
- 这声明了一个二维字符数组
- 数组有3行,每行10个字符
- 内存布局如下:
str[0]: "One\0" (地址假设为1000)str[1]: "Three\0" (地址假设为1010) str[2]: "Five\0" (地址假设为1020)
2. 指针赋值
*p = str[0];
注意:这里代码有语法错误!
- 应该是
char *p = str[0];或者先声明char *p;再赋值 - 假设代码意图是
char *p = str[0]; - 这样
p指向str[0]的首地址(即字符串"One"的开始位置)
3. 第一个printf语句
printf("%s,", p+10);
p指向str[0]的开始位置p+10指向p位置向后偏移10个字节的位置- 由于每行正好是10个字节,
p+10指向str[1]的开始位置 - 所以
p+10指向字符串 "Three" - 输出:
Three,
4. 第二个printf语句
printf("%d\n", strlen(p+10));
strlen(p+10)计算字符串 "Three" 的长度- "Three" 有5个字符
- 输出:
5
最终输出结果
Three,5
内存布局图示
地址: 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
str[0]: O n e \0 ? ? ? ? ? ?
↑
p指向这里
地址: 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
str[1]: T h r e e \0 ? ? ? ?
↑
p+10指向这里
地址: 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
str[2]: F i v e \0 ? ? ? ? ?
答案
正确答案是 C. Three,5
注意事项
- 原代码中的
*p = str[0];是语法错误,应该是指针声明和赋值 - 这种指针算术运算依赖于数组在内存中的连续存储
- 每个字符串占用固定的10字节空间,所以
p+10正好指向下一个字符串

浙公网安备 33010602011771号