как он печатает элемент трехмерного массива с двумя разыменованиями. Я думал, что нужно что-то вроде 3 разыменования printf("%c",*(*(*(a+0)+1)+1));
. кризис понимания.
int main()
{
char a[2][3][3] = {'a','b','c','d','e','f','g',
'h','i','j','k','l','m'};
printf("%s ", **a);
getchar();
return 0;
}
почему ** рабочий @WhozCraig. автоматически добавляется нулевой символ
«Он не дает сбоев, когда я запускаю его, и похоже, что он делает что-то разумное» не означает «он работает». % s ошибается, точка. Сначала исправьте это.
printf("%c",*(*(*(a+0)+1)+1));
не вызывает для меня ошибок сегментации.
@ P.W но *** причина почему
@givil: *** a - это то же самое, что и *(*(*(a+0)+0)+0)
, поэтому не должно. Это не для меня. Используя %c
.
**a
имеет тип char [3]
, то есть символьный массив. При передаче в качестве аргумента он распадается на char *
. Но ***a
имеет тип char
, который представляет собой просто целочисленный тип. Это не указатель. Это одиночный персонаж. Используйте %c
для форматирования одного символа, а не %s
.
Мы надеемся, что компилятор должен пожаловаться на небрежный стиль скобок, после чего вам следует исправить свой список инициализаторов и выделить место для нулевого завершения.
Аргумент, предоставленный для указанного %s
, должен быть указателем. Для '% s,
printfuses the pointer to fet characters from memory. Therefore, for a three-dimensional array, applying two
* to the name results in the correct type, a pointer to
char`.
Для %c
аргументом должен быть int
с символьным значением. Это достигается применением трех *
к массиву.
Примечание. Хотя **a
предоставляет правильный тип для %s
, предполагается, что аргумент указывает на символ в одномерной строке с завершающим нулем. Разрешить символам продолжать работу в разных измерениях массива - хитрость.
%s
ожидает строку с завершением. Что ты им даешь?