Skip to main content
 首页 » 编程设计

c之面试中问的指针算术输出

2023年12月27日42dyllove98

char s[] = "arista2015"; 
char *p = s; 
printf("%s",p+p[4]-p[1]); 

该程序的输出为

ista2015

有人可以解释一下输出吗?

请您参考如下方法:

p[4] 等于't'。它的ASCII码是116。

p[1] 等于'r'。它的ASCII码是114。

因此 p+p[4]-p[1]p+2,即 p 过去 2 个字节指向: 编辑:马特的回答提出了一个非常好的观点——字符串之外的指针算术也是未定义的行为,所以p+116-114p+2 实际上并不能保证是同一件事。

'a' 'r' 'i' 's' 't' 'a' '2' '0' '1' '5' '\0' 
 ^       ^ 
 p      p+2 

有趣的是,这是undefined behavior , 尽管!在EBCDIC上系统,它会打印一个空字符串,如 't' - 'r' == 10 (是的,确实如此)。 C99标准只保证十进制数字对应的代码'0''1''2'...'9' 是连续的。