Разница между указателем и ссылкой

И указатели, и ссылки являются наиболее мощными функциями в C и C ++, которые позволяют программистам напрямую манипулировать адресом памяти для эффективного управления памятью..

Оба являются переменными, которые используются для косвенного обращения к другим объектам, и они имеют некоторые общие черты на поверхности. Хотя они имеют много общих возможностей, они также очень сложны для понимания.

Указатель - это переменная, которая содержит адрес памяти другой переменной, тогда как ссылка подобна указателю, который можно использовать для косвенной ссылки на другую переменную..

Кажется, что большинство программистов имеют некоторое понимание того, когда использовать указатели и когда использовать ссылки, но они часто сталкиваются с проблемами, решение которых кажется неясным.

Итак, чтобы лучше понять философию, давайте поймем разницу между двумя.

Что такое указатель?

Каждая переменная является ячейкой памяти, которая определяется ее адресом и связана с идентификатором, который содержит некоторое значение, которое может быть изменено в ходе выполнения программы. Проще говоря, переменная является символом, который представляет количество.

Указатель - это переменная, которая содержит адрес памяти другой переменной. Указатель - это не что иное, как адрес, а переменная, в которой хранится указатель, называется переменной указателя.

Идея состоит в том, чтобы использовать идентификаторы (или имена) вместо числовых адресов, чтобы облегчить бремя программирования, тем самым уменьшая сложность программ. Поскольку эти адреса относятся к фактическим местам в памяти компьютера, указатели могут использоваться для доступа и управления содержимым, хранящимся в памяти..

Как и любая переменная или константа, указатели должны быть объявлены для их типов. Поскольку указатели содержат адреса памяти, принадлежащие отдельному типу данных, они должны быть объявлены с использованием указателей, прежде чем вы сможете работать с ними. Общая форма объявления указателя:

Тип данных * var-name;

Здесь «Data_type» является базовым типом указателя, а «var-name» является переменной указателя. Звездочка (*) здесь используется для объявления указателя, который обозначает переменную «var-name» как переменную-указатель.

int * p; // целочисленный указатель

плавать * х; // плавающий указатель

Здесь переменная «p» указывает на целочисленный тип данных, который объявлен как «int», который относится к типу данных переменной. Аналогично, во втором примере «float» относится к типу данных переменной «x», которая фактически обозначается как указатель на переменную с плавающей точкой..

Что такое ссылка?

Ссылка похожа на указатель с косвенным доступом к переменной. Это как псевдоним для другой переменной, то есть это просто другое имя для уже существующей переменной.

Это позволяет программистам создать второе имя для переменной, которое они могут использовать для управления содержимым, хранящимся в этой переменной. Это сущность, которая является псевдонимом для другой переменной и имеет тот же адрес, что и исходная переменная. Он поддерживает передачу по ссылке, выступая в качестве формальных параметров функции, и как только он определен для ссылки на переменную, он не может быть повторно установлен, что означает, что его нельзя ссылаться на другую переменную..

В отличие от указателей, им не нужен оператор разыменования для доступа к значению; на самом деле их можно использовать как обычные переменные.

int i;

int & ri = i;

Здесь «ri» является целочисленной ссылкой, инициализированной как «i». Он объявляет «ri» как объект типа «ссылка на int». Ссылка может быть легко перепутана с указателем, который является независимой переменной, значения адреса которой не могут быть переназначены после создания.

Разница между указателем и ссылкой

  1. Основы указателя и ссылки

- Оба предоставляют почти одинаковые возможности с точки зрения удобства использования, и различие может быть сложным. Указатель - это просто переменная, которая хранит адрес памяти другой переменной, тогда как ссылка похожа на псевдоним для уже существующей переменной. Он создает второе имя для переменной, которая может использоваться для изменения содержимого, хранящегося в этой переменной.

  1. Декларация указателя и ссылки

- Указатель похож на любую другую переменную, которая хранит часть данных. В отличие от других переменных, переменные-указатели хранят адреса памяти вместо значений. Указатель разыменовывается с помощью оператора косвенного обращения *, чтобы получить доступ к области памяти переменной, на которую он указывает. Ссылка, с другой стороны, не нуждается в операторе разыменования для доступа к значению.

  1. Переназначение указателя и ссылки

- В отличие от указателей, которые могут быть инициализированы в любое время, ссылки должны быть назначены при инициализации. Указатели могут быть доступны напрямую, тогда как ссылки не могут быть доступны напрямую.

  1. Адрес памяти для указателя и ссылки

- Переменная указателя имеет свое собственное местоположение в памяти, что означает, что когда вы объявляете указатель, вы указываете местоположение, которое является адресом памяти, назначенным каждой единице памяти. Переменная-указатель имеет тот же адрес, что и в памяти. Ссылочная переменная, с другой стороны, является псевдонимом для другой переменной, таким образом, беря адрес ссылочной переменной.

  1. Значение NULL для указателя и ссылки

- NULL представляет конец списка, что означает, что значение неизвестно, и указывает, что переменная не имеет допустимого адресного пространства. Значение NULL может быть присвоено переменной указателя напрямую, что предполагает, что оно нигде не указывает, тогда как значение NULL не может быть назначено ссылочной переменной..

Указатель против ссылки: Сравнительная таблица

Резюме указателя против ссылки

Указатели всегда были в числе любимых тем обсуждения программистов на C / C ++ до тех пор, пока не появились ссылки на картинку. Ссылки в чем-то похожи на указатели, но в сравнении имеют свои плюсы и минусы. Хотя оба могут использоваться для изменения локальных переменных одной функции в другой функции, они имеют свои различия. Оба являются мощными функциями в C и C ++, которые позволяют вам напрямую манипулировать памятью, но с некоторыми исключениями. Указатель содержит адрес памяти переменной, тогда как ссылка является просто псевдонимом для другой переменной.