C 下面的程序如何进行指针操作

C 下面的程序如何进行指针操作,c,pointers,string,C,Pointers,String,可能重复: 这是一个正在运行的程序 #include<stdio.h> int main () { char c[]="GATE2011"; char *p=c; printf("%s",p+p[3]-p[1]); } 现在问题来了,我不能理解操作p+p[3]-p[1] 那是指什么 我的理解是当我宣布一些事情 char c[]="GATE2011" 然后c是指向字符串常量的指针,字符串以G开头。 在下一行*p=c 指针p指向的地址与c指向的地址相同。 那么上面的算术是如何工作的

可能重复:

这是一个正在运行的程序

#include<stdio.h>
int main ()
{
char c[]="GATE2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
}
现在问题来了,我不能理解操作p+p[3]-p[1] 那是指什么

我的理解是当我宣布一些事情

char c[]="GATE2011"
然后c是指向字符串常量的指针,字符串以G开头。 在下一行
*p=c
指针p指向的地址与c指向的地址相同。

那么上面的算术是如何工作的呢?

p[3]
是“E”,而
p[1]
是“A”。ASCII码A和E之间的差异为4,因此
p+p[3]-p[1]
相当于
p+4
,后者又相当于
&p[4]
,因此指向字符数组中的“2”字符

但是,任何在生产代码中编写此类代码的人都会被枪毙。

就是这样

pointer + char - char
它有一个指针值

这是基本的指针算法

您可以添加一些括号(与语言指定的顺序不同,但结果是相同的值),以便于理解

pointer + (char - char)

那是

&p[4]

或者字符串
“2011”

这是非常可怕的代码
(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标准不允许的。

简单数学

p[3]
='E',
p[1]
='A'

整个事情是
p+'E'-'A'
这是'p+4',它指向'2'。

\include
#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    */
}
int main() { 字符c[]=“GATE2011”; char*p=c;//这里您将字符数组c的地址分配到指针p中 printf(“%s”,p+p[3]-p[1]); /*p表示c[0]的内存位置,如果在p中添加任何内容 i、 它成为下一个内存块,在这种情况下是p+p[3]-p[1] 向前取4个字节,并将2011作为输出*/ }
括号应该是另一种方式,因为加法和减法是左关联的…@pmg谢谢你,我正在努力改进我的C,我读了又读了Kernighnan Ritchie,但我没能解决上面的问题。有没有可能参考任何我能理解更多指针操作的书或链接?@Oli:是的,你说得对。。。但是
(p+'E')
是UB:)@pmg:不,不是!这很可怕,但它不是UB。@奥利:想象原始的
c
数组(9字节长)位于地址
0xfffff0
p+'E'
跨越
0x100000000
边界。错误。。。谢天谢地,标准允许UB:-)
(p+69-65)
(p+4)
#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    */
}