Чем отличается char* от int*, float* и других в Си?
Размер указателя один и тот же, если вы это имеете ввиду.
char* отличается от int* тем, что первый указывает на область памяти в sizeof(char) байт, а второй в sizeof(int) байт. Это важно, например для адресной арифметики.
Например имеем:int ival[] = {0,1,2,3};
char* pc = "This is a string";
int* pi = &ival;
Если мы делаем pc++, то к pc прибавляется sizeof(char), а в случае pi++ к pi прибавляется sizeof(int).
А так же, когда мы делаем разъименование, то получаем в результате соответствующий тип:
*pc - дает char
*pi - дает int
Если бы не было типизации указателей, то не было бы и адресной арифметики и разъименования. Посмотрите, например, что можно сделать с указателем на void.
Указатель - это переменная, которая хранит адрес одного байта в памяти. Часто и сам адрес называют указателем, потому что сам адрес обычно не используется и подразумевает только то, что находится по этому адресу (поэтому они стали синонимами).
По одному адресу ты не можешь сказать, сколько байт там можно рассматривать целиком, так как сам адрес даёт информацию только об одном байте. Поэтому у указателя есть тип, который означает, что по тому адресу лежит столько-то байт, которые надо рассматривать как единое целое.