You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于char数组与指针的困惑:代码输出与预期不符的疑问

问题解析

先看你的代码:

char a[][5] = { "abc", "ijk", "defg", "opq" };
char *p = &a[1][1];
printf("%d,%s,%s", a[2] - a[0], &p[1], &p[5]);
// 实际输出:10,k,"efg"
// 我的预期:3,k,'e'

关于a[2] - a[0]输出10的原因

  • 你误解了a[2]和a[0]的类型:它们不是单个字符,而是指向char数组的指针(数组名在表达式中会退化为指向首元素的指针)。
  • 二维数组a的每个子数组长度是5(声明时指定第二维为5),a[0]指向第一个子数组的起始地址,a[2]指向第三个子数组的起始地址,两者间隔2个完整的子数组。
  • C语言中同类型指针相减,结果是两者之间的元素个数(以指针指向的元素大小为单位)。这里每个子数组占5字节,所以a[2]-a[0]的字节偏移量是2*5=10,用%d输出就是10。

关于&p[5]输出"efg"的原因

  • char *p = &a[1][1]; 这里p指向第二个子数组的第二个元素'j'。
  • p[5]等价于*(p+5),地址偏移计算:p的起始地址是a[1]+1,加5个char长度后,刚好指向第三个子数组的第二个元素a[2][1](即'e')。
  • printf的%s格式符会从指定地址开始输出字符串,直到遇到'\0'。a[2]存储的是"defg",所以从'e'开始依次输出'e'、'f'、'g',直到末尾的'\0',最终输出"efg"。
  • 如果你想输出单个字符'e',需要把格式符改成%c,而非%s。

内容的提问来源于stack exchange,提问作者NitaX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:50:09