В языках программирования любое число - это инвариант, а hex, decimal, octal - лишь форма представления (отображения) числа. Поэтому в функцию передается число, а не его представление.
CHAR_BIT - макрос, количество бит в char'е. По стандарту не меньше 8 (но вполне может быть больше). sizeof(char) = 1 по определению (sizeof измеряет все в char'ах) sizeof(CHAR_BIT) - учитывая, что CHAR_BIT определен примерно как #define CHAR_BIT 8, тут вы вычисляете sizeof(int)
Звездочка здесь относится к типу, а не к имени, и означает, что это указатель, просто синтаксис C позволяет здесь поставить пробел в любом месте (или не ставить его вовсе)
По итогу, это функция match, которая принимает 2 аргумента - char и указатель на char, и возвращает так же указатель на char
С - это не Perl, это низкоуровневый язык. Работая с массивами, нужно хорошо знать тему указателей, чтобы не задавать таких вопросов.
Имя массива - это указатель на его первый элемент. То, что такая программа вообще собирается - это уступка ламерам, по идее тут ошибка должна выдаваться, чтобы давать по рукам сразу. В данном случае сравниваются два указателя, а они естественно разные.
Строковые массивы можно сравнивать через strncmp()
Числовые - перебором по значению
Вот тут я вам отформатировал ваш код.
Посмотрите внимательнее, что написано в блоке else if(...).
Буквально так - "если введённый символ не равен 'c', то -> если введенный символ не равен 'h' то выводим 'step 2'. Выводим 'step 3' "
Поэтому при вводе 'h' он пропускает печать фразы 'step 2'.