这是一个正在运作的程序
#include<stdio.h>
int main ()
{
char c[]="GATE2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
}
输出
2011
现在问题我无法理解p + p [3] -p [1]的操作 那是什么意思?
我的理解是当我宣布某些事情时
char c[]="GATE2011"
然后c是指向字符串常量的指针,字符串以G开头。
在下一行*p=c;
指针p指向c指向的相同地址。
那么上面的算法是如何工作的呢?
答案 0 :(得分:8)
p[3]
是'E',p[1]
是'A'。 ASCII码A和E之间的差异为4,因此p+p[3]-p[1]
相当于p+4
,而&p[4]
相当于{{1}},因此指向“{1}”中的“2”字符。 char数组。
任何发现在生产代码中写这类东西的人都会被枪杀。
答案 1 :(得分:3)
那是
pointer + char - char
具有指针值
这是基本的指针算法......
您可以添加一些括号(以与语言指定的顺序不同但产生相同值的顺序)以使其更易于理解
pointer + (char - char)
或
p + ('E' - 'A')
或
p + 4
是
&p[4]
或字符串"2011"
。
答案 2 :(得分:3)
这是非常可怕的代码。 (p+p[3]-p[1])
只是添加和减去p
的偏移量。 p[3]
为(char)'E'
,ASCII为69。 p[1]
为(char)'A'
,ASCII为65。所以代码相当于:
(p+69-65)
是:
(p+4)
因此,在将指针传递给printf
之前,只需将指针移除4个元素。
从技术上讲,这是未定义的行为。该表达式的第一部分(p+69
)将指针偏移到数组的末尾之外,这是C标准所不允许的。
答案 3 :(得分:0)
简单的数学。
p[3]
='E',p[1]
='A'
整个事情是p+'E'-'A'
,即'p + 4',它指向'2'。
答案 4 :(得分:0)
#include<stdio.h>
int main ()
{
char c[]="GATE2011";
char *p=c; // here you allocated address of character array c into pointer p
printf("%s",p+p[3]-p[1]);
/* p refers to the memory location of c[0],if you add any thing in p
i.e p+1 it becomes next block of memory,in this case p+p[3]-p[1]
takes 4 bytes forward and gives 2011 as output */
}