В идеальном мире это не так. Вы используете char * для строк в стиле C (которые заканчиваются NUL и вы можете измерить длину), а unsigned char * только для байтовых данных (длина которых указывается в другом параметре или в любом другом месте, и в которые вы, вероятно, попадете контейнер STL КАК МОЖНО СКОРЕЕ, например vector<unsigned char>
или basic_string<unsigned char>
).
Основная проблема заключается в том, что вы не можете делать переносимые предположения о том, совпадают ли представления памяти для char и unsigned char. Обычно они есть, но им позволено не быть. Таким образом, нет строковых библиотечных функций, которые работают с unsigned char *, только с char *, и в общем случае небезопасно приводить unsigned char * к знаку char * и обрабатывать результат как строку. Поскольку char может быть подписан, это означает, что нет приведения неподписанного char * к char *.
Однако, 0 всегда одно и то же представление значения в беззнаковых символах и символах. Так что в неидеальном мире, если у вас есть строка в стиле C откуда-то, но она пришла как беззнаковый char *, то вы (a) приводите ее к char * и продолжаете с ней, но также и (b) ) узнай, кто сделал это с тобой, и попроси их прекратить.