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