Я думал, что каждая фигура состоит из массива указателей символов
const char *D51 [FrameHeight] = {
" \\ 0 / ",
" \\|/ ",
" | ",
" / \\ ",
"_/ \\_ "
};
, за которыми следуют другие цифры * D52, * D53, * D54.Тогда у нас будет указатель на указатель, который будет содержать адреса этих цифр, такие как
const char **ptr [NumOfFrames];
*ptr = D51;
*(ptr+1) = D52
..
, теперь, когда у нас есть адреса для каждого отдельного символа, назначенного ** ptr, прямо или косвенно мы можем идти впереди работать над печатью рисунков.Например, это даст нам первую цифру
for (int i=0; i<5; i++)
printf("%s\n", *(*(ptr)+i));
, а чтобы сделать *(*(ptr)+i)
более понятным, давайте разберем ее **ptr
- указатель на указатель и, следовательно, *ptr
будет содержать адрес указателяпричина, по которой в *(ptr)
заключены квадратные скобки, заключается в том, что мы хотим выбрать нужную нам фигуру, если мы хотим, чтобы первая цифра называлась *ptr
, и если мы хотим, чтобы вторая фигура отображалась, мы просто вызываем *(ptr+1)
и такon.
+i
позволяет нам указать, какую строку цифры вызывать, например, если мы хотим вызвать первую строку, мы можем оставить i
равным 0
, но если мы хотимНазовите нижнюю строку фигуры, нам нужно, чтобы i
было 4
.Точно так же, как *(ptr)+4
.
Теперь, когда мы указали и номер рисунка, и номер строки, все, что нам нужно сделать, это разыменовать указатель, добавив оператор *
.*(*(ptr)+i)
пример кода, который я написал:
..
..
const char *D54 [FrameHeight] = {
" ",
" ",
" __ ",
" /_\\\\0_ ",
" _\\\\/_ \\_"
};
const char **ptr [NumOfFrames];
int main(){
*ptr = D51;
*(ptr+1) = D52;
*(ptr+2) = D53;
*(ptr+3) = D54;
for(int j=0; j<4; j++)
{
for (int i=0; i<5; i++)
printf("%s\n", *(*(ptr+j)+i));
puts (" "); //this is nothing more than a newline character
}
return 0;
}
вывод:
\ 0 /
\|/
|
/ \
_/ \_
__0__
/ | \
/ \
_\ /_
o
/\ /\
|/ \|
_\ /_
__
/_\\0_
_\\/_ \_