Напомним, что C передает параметры только по значению.
В вашем примере,
changeCharName(char * name2)
{
name2 = "Jose";
}
Когда вы вызывали changeCharName (), вы передавали значение, содержащееся в переменной name2, в вашей процедуре main (). (Это значение на самом деле было мусором, поскольку вы никогда не указывали name2 ни на что.) Когда запускалась changeCharName (), она сохраняла переданное значение в локальном временном хранилище, а затем изменяла это локальное временное хранилище, чтобы оно содержало адрес консервированной строки. Тем не менее, когда changeCharName () возвращает, (обновленный) локальный временный путь идет по пути всех временных переменных.
В вашей модифицированной версии вы вместо этого передали АДРЕС локальной переменной name2 в main () и написали THROUGH по этому адресу, чтобы изменить значение, хранящееся в этой локальной переменной.
Вот почему студенты, изучающие информатику, берут язык ассемблера на ранних этапах своей карьеры, поэтому они понимают реальное значение слова «адрес». Именно поэтому FORTRAN, PASCAL и Ada передают аргументы по ссылке, и поэтому BLISS сделал разыменование адреса явной операцией.