2011-02-14 102 views
1

的代碼片段給出如下:字符數組,指針

char *s[] = {"program", "test", "load", "frame", "stack", NULL}; 
char **p = s + 2; 

我們需要找到輸出聲明如下:

printf("%s", p[-2] + 3); 

是什麼p[-2]指什麼?

+3

需要'家庭作業'標籤嗎? – 2011-02-14 11:54:35

+2

存在語法錯誤:`printf {...);`不會編譯。 – vz0 2011-02-14 12:11:18

回答

2
char *s[] = {"program","test","load","frame","stack",NULL}; 
char **p = s + 2 
printf("%s", p[-2] + 3); 
  • 可變schar*指針的數組。
  • 變量p是一個指向指針的指針。指針算術將陣列s降級爲char**,將p初始化爲值爲char**大小的兩倍的值。在32位機器上,如果s指向1000,p將指向1008

表達p[-2]相當於*(p - 2),返回一個簡單的指針到一個char*。在這種情況下,指向字符串數組的第一個元素的值:"program"

最後,由於*(p - 2)是指向串"program"*(p - 2) + 3指向字的第四個字母的第一個字母的表達:"gram"

printf("%s", *(p - 2) + 3); /* prints: gram */ 
0

你試過編譯你的代碼嗎?一旦語法錯誤被修復,輸出是

#include <stdio.h> 

int main() 
{ 
    char *s[] = {"program","test","load","frame","stack",NULL}; 
    char **p = s + 2; 

    printf("%s",p[-2] + 3); 

    return 0; 
}; 

查看http://ideone.com/eVAUv的編譯和輸出。