int main()
{
char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;
printf("%s", **++cpp);
printf("%s", *--*++cpp+3);
printf(" %s", *cpp[-2]+3);
printf("%s", cpp[-1][-1]+1);
system("pause");
return 0;
}
Объясните пожалуйста почему вывод: POINTER STEW
На уроке не объяснили толком ничего про указатели, ни инкремент, ни дикремент.
Также не понимаю почему код printf("%s", *(c+1)); компилится, а
printf("%s", *++c); не компилится.
Ответ
//массив указателей на строковые константы
char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
char **cp[] = {c+3, c+2, c+1, c}; //первый элемент c+3,
// т.е. мы идем три раза вперед на размерность с и попадаем на POINT
char ***cpp = cp; //ехал указатель через указатель,
// видит в реке указатель,
// сунул указатель в указатель,
// гитлер гитлер гитлер гитлер
printf("%s", **++cpp); //выводится POINT
printf("%s", *--*++cpp+3); //снова шастаем по указателям,
// приходим на ENTER, прыгаем на 3 размера данного указателя вперед
// (теперь это char жизнь, сынок, это просто, как ездить на велосипеде,
// и мы в аду и ты горишь и велосипед горит)
// вместо ENTER получаем ER (ENT ER)
// выводится в итоге POINTER
дальше сам понимаешь.
И да, ужасы у вас какие на уроках.
когда кто-нибудь посмотрит в этот ужасный пример и более подробно разберет, с радостью удалю ответ, мне главное чтобы ОП бритвой по венам не прошелся.
тут намек на решение, спасибо за хороший пример, pointer stew гуглится на ура, задача из книги "The C Puzzle Book"
p.s. Pointer stew переводится как (густой)суп (похлебка, тушеный) указатели. Cуп из указателей. Красиво.
Комментариев нет:
Отправить комментарий