В C есть указатели, а в Java есть так называемые ссылки. У них есть что-то общее в том смысле, что все они указывают на что-то. Я знаю, что указатели в C хранят адреса, на которые они указывают. Ссылка также хранит адрес? Чем они отличаются, кроме того, что указатель более гибкий и подвержен ошибкам?
97
final
ссылка в Java почти эквивалентна ссылке на C ++. Причина, по которой они не совсем эквивалентны, заключается в том, что ссылка на C ++ дополнительно не может иметь значение null, в то время какfinal
ссылка на Java является nullable.Ответы:
Ссылки могут быть реализованы путем сохранения адреса. Обычно ссылки на Java будут реализованы в виде указателей, но это не требуется в спецификации. Они могут использовать дополнительный уровень косвенности, чтобы упростить сборку мусора. Но, в конце концов, это (почти всегда) сводится к указателям (в стиле C), участвующим в реализации ссылок (в стиле Java).
Вы не можете сделать арифметику указателей со ссылками. Наиболее важное различие между указателем в C и ссылкой в Java заключается в том, что вы не можете получить (и манипулировать) базовое значение ссылки в Java. Другими словами: вы не можете делать арифметику указателей.
В C вы можете добавить что-то к указателю (то есть адресу) или вычесть что-то, чтобы указать на то, что находится «рядом», или указать на места, которые находятся в любом месте.
В Java ссылка указывает на одну вещь и только эту вещь. Вы можете заставить переменную содержать другую ссылку, но вы не можете просто попросить ее указать «вещь после оригинальной вещи».
Ссылки строго напечатаны. Другое отличие состоит в том, что тип ссылки гораздо более строго контролируется в Java, чем тип указателя в C. В C вы можете иметь и приводить
int*
его к achar*
и просто заново интерпретировать память в этом месте. Эта переинтерпретация не работает в Java: вы можете интерпретировать объект на другом конце ссылки как нечто, чем он уже является (то есть вы можете привестиObject
ссылку наString
ссылку, только если объект, на который указывает объект, фактически является aString
).Эти различия делают указатели C более мощными, но и более опасными. Обе эти возможности (арифметика указателей и повторная интерпретация указанных значений) добавляют гибкость C и являются источником некоторых возможностей языка. Но они также являются большими источниками проблем, потому что при неправильном использовании они могут легко нарушить предположения, что ваш код построен вокруг. И довольно легко использовать их неправильно.
источник
memcpy
перемещения одного в achar[]
) и наоборот. Если указатель преобразуется в последовательность чисел, которая хранится где-то (возможно, отображается на экране и копируется оператором на листке бумаги), все копии указателя в компьютере уничтожаются, и эта последовательность чисел преобразуется Возвращаясь к указателю (возможно, после ввода оператором), указатель все равно должен указывать на то же, что и раньше. Программа, которая ...C ++ ссылки снова разные.
Они должны быть инициализированы и не могут быть нулевыми (по крайней мере, не в правильно сформированной программе) и не могут быть повторно установлены, чтобы ссылаться на что-то еще. ссылка на C ++ намного больше похожа на псевдоним для объекта.
Другое важное различие между указателями и ссылками на Java / C ++ состоит в том, что вы можете взять адрес указателя, к которому у вас нет доступа к адресу ссылки (действительно, ссылка на C ++ вообще не обязательно должна существовать как объект в памяти), следовательно, вы можете иметь указатель на указатель, но не ссылка на ссылку
источник
Ссылки Java и C указатели отличаются ровно в двух точках:
char
,int
и так далее).Кто-то писал, что ссылки строго типизированы, потому что вы не можете заставить компилятор рассматривать a
int*
как achar*
.Полностью помимо того факта, что это конкретное преобразование действительно безопасно , в C нет полиморфизма, так что сравнение не является началом.
Конечно, Java более строго типизирована, чем C, не то, чтобы это особенность указателей C по сравнению с ссылками на Java, вам нужно использовать JNI, чтобы нарушить безопасность типов (помимо игнорирования общих ограничений), но даже в C вы должны заставить компилятор.
Кто-то писал, что ссылки на Java могут быть реализованы как указатели на Си, на что я уверен, поскольку они строго менее мощные, на 32-битных машинах, как это обычно бывает, если JVM реализована на Си . Хотя на 64-битных машинах они обычно сжимаются обычными объектными указателями («сжатые ООП») для экономии места и пропускной способности.
В любом случае, эти указатели C также не обязательно должны быть эквивалентны аппаратным адресам, даже если они обычно (> 99% реализаций) предназначены для повышения производительности.
Наконец, это деталь реализации, которая не предоставляется программисту.
источник
Они немного разные. В Java копия ссылки копируется в стек вызываемой функции, указывая на тот же объект, что и вызывающая функция, и позволяя вам манипулировать этим объектом. Однако вы не можете изменить объект, на который ссылается вызывающая функция.
Рассмотрим следующий код Java
Теперь рассмотрим указатель в c ++:
источник