Для работы с указателями существует два оператора — амперсанд & и звёздочка *. Если перед именем переменной стоит амперсанд, значит мы хотим получить адрес этой переменной. Звездочка - это оператор разыменовывания. В примере указатель ptr не содержит значение переменной p типа int, а содержит только ее адрес. Адрес в памяти представляет собой шестнадцатеричное число, например, 0x1400009c018. Каждая программа при запуске создается в собственном пространстве памяти, указатель будет разным при каждом запуске, поэтому, если вы запустите код из примера, то адрес у вас будет другим. Изменение значения по указателю Переменная ptr указывает на адрес переменной str. Это означает, что если мы изменим значение, на которое указывает переменная ptr, мы также изменим значение переменной str. В конце мы установили для переменной-указателя ptr значение nil, тем самым освободим область памяти, выделенную под переменную ptr. Значение переменной str не изменилось. Передача по значению и по ссылке В Go