关于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
相关产品推荐
相关产品推荐

