Я думаю, вы как раз там, но вы путаете терминологию. Давайте снова посмотрим на ваши примеры:
andy = 25;
Фред = Энди;
Тед = & andy;
В первой строке присваивается значение 25 для andy.
Во второй строке присваивается значение, которое хранит andy для fred (в данном случае 25).
Третья строка назначает адрес Энди Теду.
Все три переменные содержат независимые значения. Изменение любого из них не повлияет на остальные.
Теперь рассмотрим следующий пример:
andy = 25;
Фред = Энди;
ted = & andy;
Джо = * Энди;
Как вы сказали, первые три строки одинаковы. В четвертой строке присваивается значение, на которое указывает andy, joe В этом случае joe теперь будет хранить значение в ячейке памяти 25, потому что andy обрабатывается как ячейка памяти (и в этом случае фактическое значение неизвестно, потому что мы не знаем по данным, что хранится по адресу 25).
И снова все четыре переменные содержат независимые значения в этой точке. Изменение любого из них не повлияет на ценность других.
Итак, давайте посмотрим на другой пример:
andy = 35;
Джим = & Энди;
alex = * jim;
В первой строке присваивается значение 25 для andy. Здесь нет ничего нового.
Вторая строка назначает адрес Энди Джиму.
Третья строка разыменовывает адрес, сохраненный в jim, и присваивает значение alex. Переменная alex теперь содержит значение 25. Но 25, которые содержит alex, отличается от 25, чем то, что держит alan, потому что alan и alex живут по разным адресам памяти. Если мы изменим значение alan на 30, alex все равно будет удерживать 25.
Последний пример:
andy = 25;
jim = & andy;
* джим = 30;
Первые две строки такие же, как в предыдущем примере, andy имеет значение 25, а jim содержит адрес andy.
Третья строка присваивает значение 30 адресу памяти, указанному Джимом. Поскольку это тот же адрес, по которому живет andy, andy теперь имеет значение 30. В этом случае andy и * jim ссылаются на одну и ту же ячейку памяти.
Термины передача по значению и передача по указателю (или передача по ссылке) относятся к передаче параметров в функции. При передаче по значению, например:
void myfunc(int a) { a = a+5; }
А затем вызывается как:
int b = 2;
MyFunc (б);
Значение b по возвращении из функции не изменяется, потому что вы просто передали значение b в функцию, присвоив его a. Переменная a была изменена, но, поскольку она находится по другому адресу памяти, изменение a не повлияло на значение b.
Но при передаче по указателю, как в:
void myfunc(int* a) { *a = *a+5; }
А затем вызывается как:
int b = 2;
MyFunc (& б); * +1070 *
Значение b изменено с 2 на 7, потому что вы передали адрес b в функцию, а затем разыменовали адрес для получения текущего значения getit, добавили 5 к нему и сохранили результат обратно по тому же адресу. Когда функция возвращается, значение, сохраненное по адресу b, обновляется.