2011-08-25 66 views
1
#include<stdio.h> 
int main() 
{ 
    static char *s[]={"black","white","pink","violet"}; 
    char **ptr[]={s+3,s+2,s+1,s},***p; 
    char a[]={"DEAD"}; 
    p=ptr; 
    ++p; 
    printf("%c\n",a[0]); 
    printf("%s\n",*s); //black 
    printf("%s\n",*s+1); //lack 
    //printf("%s\n",s+1); 
    printf("%s\n",s[0]);//black 
    printf("%s\n",s[1]);//white 
    printf("%s\n",s[2]);//pink 
    printf("%s\n",s[1]);//violet 
    printf("%s\n",s[1]+1);//hite 
    printf("%s\n",s[1]+6);//pink 
    printf("%s\n",**p+1); // how does this prints ink 
    return 0; 
} 

輸出:指針增量

d黑缺乏黑白色粉白色海特粉紅色墨水

請幫助瞭解

+1

'炭一個[] = { 「DEAD」};'看起來可疑 – knittl

+0

@knittl:'炭一個[] = { 「DEAD」 };'是好的:'{}'是多餘的,不是可疑的:-) – pmg

+0

@pmg:我對C中數組初始化符的理解有點生疏,但是我期望一個字符數組被初始化爲'= {'c'}',或者一個帶'= {「DEAD」}'的字符指針數組。 – knittl

回答

2

我假設你有沒有用線我沒有直接複製

printf("%s\n",*s+1); //lack 

*s+1相同(*s) + 1

printf("%s\n",s[1]+6);//pink 

s[1]+6相同(s[1]) + 6問題。 s[1]的類型爲char*,因此s[1]+6指向右側6個字符。 但這樣做是違法的,s[1]只指向6個有效字符。你運氣不好,你的程序沒有崩潰。

printf("%s\n",**p+1); // how does this prints ink 

大致相同的東西去**p+1 :)

2
p = ptr; 
++p; /* p now points to the second element of ptr "s+2" */ 
/* s+2 points to the third element of s "pink" */ 
/* **p+1 will point to the second character of "pink", thus "ink"; essentially **(s+2)+1 */ 
4

所以,p是指向一個字符串的指針,它基本上是一個指向char的指針。

p本身指向ptr數組的第一個元素;在p++之後它指向第二個,即s + 2。

S + 2點到S陣列中的第三元素,其是「粉紅色」

這些都是OD解除引用由**p

現在

,執行**p點的「的第一個字符的兩個級別粉色「,因此**p+1指向'i'

現在,printf將指針指向i並打印所有內容,直到下一個空字節,導致」墨水「被打印到您的控制檯。

2

你必須明白指針。

s[0]*s完全相同。

如果您有s[0]+1,它比s[0]指向一個字符。

s[1]*(s+1)相同,但它與*s+1完全不同,與s[0]+1相同。

你必須在黑板上畫箭頭。