C 采访中询问的指针算术输出
此程序将输出为 2015年 有人能解释一下输出吗?p[4]等于't'。它的ASCII码是116 p[1]等于‘r’。它的ASCII码是114 因此,p+p[4]-p[1]是p+2,即p指向的位置超过2字节:EDIT:Matt的答案提出了一个非常好的点指针算法,字符串之外的点指针算法也是未定义的行为,因此p+116-114和p+2实际上不能保证是同一个东西C 采访中询问的指针算术输出,c,string,C,String,此程序将输出为 2015年 有人能解释一下输出吗?p[4]等于't'。它的ASCII码是116 p[1]等于‘r’。它的ASCII码是114 因此,p+p[4]-p[1]是p+2,即p指向的位置超过2字节:EDIT:Matt的答案提出了一个非常好的点指针算法,字符串之外的点指针算法也是未定义的行为,因此p+116-114和p+2实际上不能保证是同一个东西 char s[] = "arista2015"; char *p = s; printf("%s",p+p[4]-p[1]); 有趣的是,这
char s[] = "arista2015";
char *p = s;
printf("%s",p+p[4]-p[1]);
有趣的是,这是,虽然!在系统上,它会打印一个空字符串,因为't'-'r'==10是的,真的。C99标准仅保证与十进制数字“0”、“1”、“2”…”对应的代码9'是连续的。由于加法运算符是左右关联的,因此关键表达式是:
'a' 'r' 'i' 's' 't' 'a' '2' '0' '1' '5' '\0'
^ ^
p p+2
而不是其他答案/评论所建议的p+p[4]-p[1]。由于p+p[4]远远超出了s的界限,这会导致,这意味着任何事情都可能发生,包括但不限于任何特定的输出。尝试运行这些代码并研究输出
(p + p[4]) - p[1]
运行这些代码,并按照上面的解释检查其工作方式
我的输出:
警察局地址:2686737
arista2015中“a”的地址:2686737
arista2015中“r”的地址:2686738
“i…”的地址2686739
2686739
ista2015p[4]=t,p[1]=r,p[4]-p[1]='t'-'r'=2s0p+2你知道你不会在真正的程序中编写那样的代码。p+p[4]-p[1]一开始就没什么可写的,这似乎真的错了。你想做什么?这只是一个采访中提出的问题,因为我不能回答,所以我在这里问了。我真的不明白人们为什么反对我的问题。这只是一个我无法理解的面试问题,我明白了。但是p[4]=“t”和p[1]=“r”。所以答案是p+2。正确-假设平台使用ASCII作为执行字符集。您确定这会导致未定义的行为吗?p+p[4]永远不会被延迟,p[1]在传递给printf之前会从中减去,这是否会导致未定义的行为将无效指针作为中间结果,即使它没有被延迟?@BrunoLevy Yes。标准中的措词是,如果指针操作数和结果都指向同一数组对象的元素,或超过数组对象最后一个元素的元素,则计算不应产生溢出;否则,行为未定义。。C11,6.5.6这是指向指针添加一个整数。
#include<stdio.h>
int main(){
char s[] = "arista2015";
char *p = s;
printf("Address of p: %d\n",p);
printf("Address of 'a' in arista2015 : %d\n",&s[0]);
printf("Address of'r' in arista2015 : %d\n",&s[1]);
p=p+p[4]-p[1]; // Now address of P becomes p + 2 so its points to address of 'i'
printf("Address of 'i....'%d\n",&s[2]);// and it print from address of i before null
printf("%d\n",p);//prints the address
printf("%s\n",p);//prints the value
}