Отказ от ответственности: это объяснение того, как это выглядит для разработчика, а не после создания кода (особенно потому, что оптимизатор может все это изменить).
C - язык очень низкого уровня. Вы должны понимать, что переменная всегда содержит значение в несколько байтов.
C также является одним из языков, которые сделали его очень удобным для доступа к более крупным структурам.
Содержимое переменной может быть:
- Значение (например, как вы упомянули число)
- Адрес в ОЗУ
- Структура, которая использует больше последовательных ПЗУ (и С позволяет использовать ее так, как если бы она была больше)
- Stuct (фиксированная длина)
- массив с фиксированной длиной
Не существует реальной концепции наличия в качестве значения переменной динамической длины, поэтому строки, а также массивы динамической длины имеют только адрес в переменной.
Так как укусы имеют переменную длину, соглашение в C:
- иметь адрес в переменной
- Чтение байтов реальных данных, начиная с этого адреса
- Считывание данных до тех пор, пока байт не станет 0 (NULL)
Это называется строка с нулевым символом в конце .
Таким образом, вы можете передать данные переменной длины в printf, и printf определит длину, посмотрев первый байт, равный 0.
Преобразование переменных, содержащих адрес, в переменные, содержащие значение, работает следующим образом:
var_with_value = *var_with_address
var_with_address = &var_with_value
"var_with_address" называется указателем.
В заключение: Вам нужно передавать строки как адрес, а не как значение, а числа как значение, а не как адрес, и в этом разница, почему вы должны использовать *