char a[2][30]
Это говорит программе, что в стеке должен быть двухмерный массив размером 2х30 символов. Это просто непрерывный блок 60 chars
, но он позволяет программе узнать правильную позицию, к которой вы пытаетесь получить доступ, используя нотацию, например [2] [3].
{"Don't walk in front of me..", "I am not follow"};
Это так называемый «строковый литеральный инициализатор для символьных и широких символьных массивов». Массив заполняется содержимым этих строковых литералов (включая '\0'
в конце). Обратите внимание, что это не заполняет все 60 символов, остальные после нулевых терминаторов также заполняются '\0'
.
printf("%c%c",
Это печатает два символа, которые указаны в следующих аргументах вызова.
*(a[0]+9)
Он берет адрес первой строки, добавляет к ней 9
и, таким образом, получает адрес k
в walk
. Затем он разыменовывается, в результате чего получается символ k
.
*(*(a+0)+5));
Это делает нечто очень похожее, просто вместо a[0]
оно записывается как *(a+0)
. Вместо 9
вы только добавляете 5
, поэтому вместо 'k'
вы получите ' '
(пробел между словами Don't
и walk
).
Вот так печатается "k "
(это k
и пробел, а не просто k
.).