2011-06-16 25 views
4

可能重複:
A c program from GATE paper如何下面的程序工作的指針操作

這裏是一個正在

#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指向的地址。 那麼上述算法是如何工作的?

+0

@sharptooth:好點! – 2011-06-16 10:16:48

回答

3

這是很可怕的代碼。 (p+p[3]-p[1])只是加上和減去p的偏移量。 p[3](char)'E',它是ASCII碼中的69。 p[1](char)'A',它是ASCII碼中的65。因此,代碼等同於:

(p+69-65) 

它是:

(p+4) 

因此它簡單地通過4個元素抵減指針,它傳遞給printf之前。

從技術上講,這是未定義的行爲。該表達式的第一部分(p+69)將指針偏移到數組的末尾,這是C標準所不允許的。

+0

Err ...幸好標準*允許* UB :-) – pmg 2011-06-16 10:42:06

8

p[3]是'E',p[1]是'A'。 ASCII代碼A和E之間的差異是4,所以p+p[3]-p[1]等於p+4,這又相當於&p[4],因此指向char數組中的'2'字符。

但是,任何人發現在生產代碼中寫這種東西都會被槍殺。

3

也就是說

pointer + char - char 

具有指針值

它的基本指針運算...

你可以添加一些括號(以不同的順序不是語言指定,但得到的以相同的值)以使其更容易理解

pointer + (char - char) 

p + ('E' - 'A') 

p + 4 

&p[4] 

或字符串"2011"

+0

加括號應該是相反的方式,因爲加法和減法是左聯合的... – 2011-06-16 10:15:39

+0

@pmg謝謝人我試圖改進我的CI閱讀和重讀Kernighnan Ritchie,但我無法做到上述問題是否有可能引用任何書籍或鏈接,我可以更多地瞭解這些指針操作? – 2011-06-16 10:19:11

+0

@Oli:是的,你是對的......但是(p +'E')'是UB :) – pmg 2011-06-16 10:21:13

0

簡單的數學。

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

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

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