Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 采访中询问的指针算术输出_C_String - Fatal编程技术网

C 采访中询问的指针算术输出

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]); 有趣的是,这

此程序将输出为

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]);

有趣的是,这是,虽然!在系统上,它会打印一个空字符串,因为'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
ista2015

p[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

 }