Если вы исключаете неподписанные типы, есть упорядоченная иерархия: подписанный символ, короткий, int, long, long long, float, double, long double. Во-первых, все, что приходит перед int в приведенном выше, будет преобразовано в int. Затем, в двоичной операции, более низкий ранжированный тип будет преобразован в более высокий, и результаты будут типом высшего. (Вы заметите, что из иерархии, когда задействуются плавающая точка и интегральный тип, интегральный тип будет преобразован в тип с плавающей точкой.)
Unsigned усложняет ситуацию: он возмущает ранжирование и части ранжирования становятся определяемыми. Из-за этого лучше не смешивать подписанные и unsigned в одном выражении. (Большинство экспертов на C ++, похоже, избегают беззнакового, если не задействованы побитовые операции. То есть, по крайней мере, то, что рекомендует Stroustrup.)
Я хочу использовать seq_cnt, чтобы объявить фактический размер tmp1
blockquote>Do
char (*tmp1)[5+1] = malloc(seq_cnt * sizeof *tmp1);
Обновить информацию о трех различных применениях звездочки [114 ] в C.
Типы / определения переменных
Здесь
char (*tmp1)[5+1]
звездочка используется для определения указателя, указателя на массив
char[5+1]
.Обратите внимание, что круглые скобки являются обязательными, поскольку
char *tmp[5+1]
определит массив из 6 указателей наchar
. Sup>Indirection (или разыменование) оператора
Здесь
sizeof *tmp1
звездочка используется, чтобы сказать компилятору не принимать размер
tmp1
, который будет размером указателя, но размер того, на что указываетtmp1
, а именноchar[5+1]
.В качестве альтернативы можно написать
sizeof (char[5+1])
. Обратите внимание, что скобки не относятся кsizeof
, так как это не функция, а оператор. Sup>Оператор умножения
Здесь
]seq_cnt * sizeof ...
звездочка используется для обозначения обычного умножения, а именно для вычисления произведения
seq_cnt
и размера чего-либо.Таким образом, в целом верхний оператор выделяет
seg_cnt
раз байтов, которые нужныchar[5+1]
, и назначает адрес 1-го байта фрагмента, выделенного дляtmp1
, заставляет его указывать на достаточно памяти для храненияseq_cnt
массивchar[5+1]
.