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码中是69p[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 */
}