在数组指针中添加和减去元素

时间:2016-01-30 17:01:47

标签: c++ c arrays pointers

我不小心偶然发现了这个问题,该问题说明了以下代码的输出 -

char abc[14] = "C Programming"; 
printf("%s", abc + abc[3] - abc[4]);

我真的不明白输出是如何产生的 - rogamming 有人可以解释一下吗?

3 个答案:

答案 0 :(得分:5)

这是非常微妙的,但代码表现出未定义的行为。这是因为首先完成添加,导致指针超出abc的范围,这是未定义的行为,即使没有取消引用。 "正确"方法是先做减法。

char abc[14] = "C Programming"; 
printf("%s", abc + (abc[3] - abc[4]));

即便如此,结果也不会一成不变,因为无法保证ASCII编码用于字符。但由于ASCII无处不在,我们将忽略它。

其他答案解释了代码背后的黑魔法,所以我不会在这里重复。

答案 1 :(得分:2)

abc[3]abc[4]只有char个值'r''o'。它们可以像其他整体类型一样使用。 'r'的值(通常)只是字符r的ASCII值。

所以abc + abc[3] - abc[4]不是神奇的,它只是指针算法。

但是,在此代码abc + abc[3]已经超出索引范围,因此代码无效。

答案 2 :(得分:2)

abcabc[14]数组的起始地址(abc[0]的地址)。 abc[3]是数组中的第4个条目,即字符rabc[4]是数组中的第5个条目,即字符or的ascii值为114,o的ascii值为111,因此您向数组指针添加114-111 = 3。 你的输出应该是" rogramming"

但是 - 如评论中所述 - 它的风格非常糟糕,也可能是未定义的行为。