以下程序如何处理指针操作

时间:2011-06-16 10:10:38

标签: c pointers string

  

可能重复:
  A c program from GATE paper

这是一个正在运作的程序

#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指向的相同地址。 那么上面的算法是如何工作的呢?

5 个答案:

答案 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    */
}