Указатель и ссылка

Anonim

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

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

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

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

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

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

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

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

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

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

Data_type * var-name;

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

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

float * x; // указатель плавания

Здесь переменная «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 ++, которые позволяют вам напрямую манипулировать памятью, но за некоторыми исключениями. Указатель содержит адрес памяти переменной, тогда как ссылка является просто псевдонимом для другой переменной.