Здрасте. Возникла проблема с определением понятий. Что есть указатель, что ссылка. Нужно дать чёткое определение. По мойму указатель - это адрес, значение по которому ничего не адресует(не является указателем). Ссылка - указатель на указатель. Это адрес переменной, который содержит другой адрес. Причём этот адрес(ссылка) адресуется - к ней есть обращения(тоесть ссылки на указатель на указатель). Эти понятия крайне запутанны, поэтому следует разобраться, дать определения или ввести новые понятия. Манипуляции ссылками и указателями в привычном понимании удаляет ясность, тупо путает. Нужна иная система понятий.
yashechka, Нет, это важно. Я написал большую часть статьи но понимаю что описание не годится, так как слишком запутанно из за отсутствия чёткой терминологии. Ссылки на ссылки, фиксапы по ссылкам и указатели по ссылкам/на ссылки - это не читаемо(я сам с трудом понимаю). Поэтому и спросил.
Допустим есть адрес в переменной. До загрузки этого адреса это указатель, а после обращения к переменной это уже ссылка(в регистре) ? Это тупик, путаница. Нужно найти норм определения для понятного описания.
Дык все ж уже разжевано в учебниках и книгах по Плюсам. С точки зрения низкого уровня ссылка ничем не отличается от указателя. Тот же самый указатель, только сбоку. Так что - если вам нужен указатель на указатель то вам надо так и писать . void** data. Вот вам будет то, о чем вы писали. Разница между указателями и ссылками появляется в работе с ними. К примеру есть фукнция MyStrict* GetStructFunc(); тогда: MyStrict* a = GetStructFunc(); тогда вам надо адресовываться так a->field1 = 0; С ссылками это бы выглядело так MyStrict& a = *GetStructFunc(); a.field1 = 0; У ссылок несколько свойств особенных 1) - они не могут быть неинициализированными 2) если передаются в функцию с параметром const - то копирования не происходит.
TermoSINteZ, Я написал выше что вопрос не имеет отношения к яп. Смотрите есть адрес. Адрес не существует без данных, тоесть на него должна быть адресация. Указатель загружен в регистр или переменную. И происходит выборка(обращение) по этому указателю. Что тогда есть ссылка, это значение регистра с указателем или без прямой адресации ссылки нет.. А если по указателю расположен указатель, то что тогда, что есть ссылка. Это какой то бред, откуда вообще взялось понятие ссылки, сишка ? Ссылка не существует без обращения по указателю, пока не произошла выборка данных, но тогда что содержит регистр при косвенной адресации ?
Если глубоко не копать, то эти вопросы не возникают. Но для описания это важно, вы тоже будите читать и не поймёте из за путаницы понятий. Есть некий адрес. Это указатель ? Или это указатель если происходит адресация ? Адресуемый указатель это ссылка ? Значение этого адреса в регистре это тоже ссылка ?
yashechka, А вы что то слишком пассивны вроде бы как в элементарном фундаментальном вопросе. У меня просто отсутствие ясности(тупик), соответственно мотивация на решение.
yashechka, Если вы понимаете суть, то не важно технарь или есчо что. Мыслительный процесс у всех одинаков, но иногда нужна помощь(неужели). Так как, как бы ты не был развит, то всё равно когда то нужно будет чьёто мнение, хотя бы для того, что бы поняли описание. Если вы не хотите думать, то зачем вы тогда тут отвечаете. Найдите другую тему, где вы будите уместны, без обид
yashechka, Яша плиз, если вы не в теме и вам нечего по существу сказать - не пишите, не в обиду. Это ж не хип Indy_ Инди, вы меня удивляете, если вам не интересует ЯП (ООП) , а ссылка это больше сущность ЯП, то в чем вопрос? Ведь по сути чтоб узнать как компилируется ссылка, достаточно посмотреть код компилятора. Я думаю вы владеете этим. По терминологии я, как мне показалось достаточно четко показал в чем различие По низкому уровню - ок. Заходим https://godbolt.org/ Вбиваем код Код (C): #include <stdio.h> struct MyStruct { int field1; int field2; }; // Type your code here, or load an example. int main() { MyStruct nativeStruct = {0}; MyStruct* pointer = &nativeStruct; printf("%x", pointer); printf("%x", pointer->field1); MyStruct& link = *pointer; printf("%x", link); printf("%x", link.field1); } Видим результат (Выбираем компилятор X86-64 CL (майкрософт компайлер) Код (ASM): $SG4882 DB '%x', 00H $SG4883 DB '%x', 00H $SG4884 DB '%x', 00H $SG4885 DB '%x', 00H EXTRN __acrt_iob_func:PROC EXTRN __stdio_common_vfprintf:PROC pointer$ = 32 nativeStruct$ = 40 link$ = 48 main PROC push rdi sub rsp, 64 ; 00000040H mov DWORD PTR nativeStruct$[rsp], 0 lea rax, QWORD PTR nativeStruct$[rsp+4] mov rdi, rax xor eax, eax mov ecx, 4 rep stosb lea rax, QWORD PTR nativeStruct$[rsp] mov QWORD PTR pointer$[rsp], rax mov rdx, QWORD PTR pointer$[rsp] lea rcx, OFFSET FLAT:$SG4882 call printf mov rax, QWORD PTR pointer$[rsp] mov edx, DWORD PTR [rax] lea rcx, OFFSET FLAT:$SG4883 call printf mov rax, QWORD PTR pointer$[rsp] mov QWORD PTR link$[rsp], rax mov rax, QWORD PTR link$[rsp] mov rdx, QWORD PTR [rax] lea rcx, OFFSET FLAT:$SG4884 call printf mov rax, QWORD PTR link$[rsp] mov edx, DWORD PTR [rax] lea rcx, OFFSET FLAT:$SG4885 call printf xor eax, eax add rsp, 64 ; 00000040H pop rdi ret 0 main ENDP Ну что и требовалось доказать - одинаково Там в редакторе на сайте очень удобно смотреть какой кусок асм кода за какую конструкцию отвечает. Вот и сравните
Indy_, Ссылка - это тот же указатель, но гарантированно валидный (т.е. не NULL и не указывающий в неведомые е.беня).
Ну я бы так не надеялся )) выстрелить в ногу мы себе всегда сможем ))) (выделяем память, делаем ссылку, освобождаем память - Ы)
TermoSINteZ, Какая разница на каком яп собрали код. Есть указатель и релок для него. Указатель на это можно назвать ссылкой ? Для этого значение указателя должно быть загружено ?