2011-02-14 103 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的编译和输出。