Символьный массив и указатель - PullRequest
1 голос
/ 14 февраля 2011

Фрагмент кода имеет вид:

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

Нам нужно найти вывод следующего утверждения:

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

Что означает p[-2]? 1010 *

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011
char *s[] = {"program","test","load","frame","stack",NULL};
char **p = s + 2
printf("%s", p[-2] + 3);
  • Переменная s представляет собой массив char* указателей.
  • Переменная 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 голосов
/ 14 февраля 2011

Вы пытались скомпилировать свой код?Как только синтаксические ошибки исправлены, вывод будет грамм .

#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 для компиляции и вывода.

...