Работа с указателями может быть непростой задачей. Это случается со всеми, кто пытается выучить указатели. Я проведу вас через небольшие строительные блоки, изучая суть и работу указателей на каждом этапе.

Указатель:
Указатель - это переменная, которая содержит адрес другой переменной указанного типа данных (например, int, float, char). В программировании мы в основном используем указатели для хранения адреса другой переменной.

Переменная-указатель объявляется со знаком «*» перед ней.

int * a. a (здесь указатель типа int) может содержать только адреса переменных типа int. Назначение другого типа переменной является нарушением ограничения.

Понимание объявления указателей:

Самый важный момент в указателях.

int * a = & b - это простой способ присвоить адрес b переменной a. Это не означает, что * a равно «адресу b».
Чтобы легко понять, посмотрите на пояснение ниже.

int * a = & b на самом деле является простой записью,
int * a;
a =

Давайте посмотрим на пример:

int b=10; 
int *a=&b;

Предположим, что адрес b - 1000, а адрес a - 4000.

Примечание. Все указанные здесь адреса не являются фактическими значениями, но используются для упрощения демонстрации.

Это так просто.
значение для b равно 10
адрес для b (то есть & b) равно 1000
значение элемента a (которое является адресом элемента b) равно 1000
значению элемента * a (которое является значение из b) равно 10

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

Приравнивая два указателя:

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

int b=10;
int c=20;
int *a=&b;
int *d=&c;
a=d; 
//in short we are telling 'a' to point to the address 'd'is pointing to

Теперь a содержит адрес c, а не b.

Если вы дошли до этой точки, значит, вы всего в одном шаге от чувства аааааааааааааааааааааааааааааааааааааааредела более ясной для вас 🧠

Знаменитый пример значений Swap

Теперь вы знаете, как на самом деле работают указатели. Но зачем они нам? Зачем нужен указатель ?. Я возьму знаменитый пример значений подкачки и проиллюстрирую суть указателя.

Предположим, у вас есть две переменные,
int a = 10, b = 20;
Мы заинтересованы в том, чтобы поменять местами значения a и b, передав их функции. напишем нужный код. Пожалуйста, прочтите код из основной функции, затем посмотрите на функцию подкачки.

void swap(int c, int d)
{
int temp; 
   temp=c; 
   c=d; 
   d=temp;
}
void main()
{
int a=10,b=20;
  swap(a,b);
  printf(“a= %d b= %d”,a,b);
}

Результат приведенного выше кода:
a = 10 b = 20.
Но мы поменяли их местами правильно ?. Здесь мы упускаем из виду главное. давайте посмотрим на переменные и их значения.

Меняются локальные переменные функции swap («c» и «d»), но не «a» и «b». Это не то, что мы хотим от нашей функции.

Теперь давайте сделаем это с помощью указателей.
Написание той же функции, но с использованием указателей.

void swap(int *c,int *d)
{
int temp; 
temp=*c; 
*c=*d; 
*d=temp;
}
void main()
{
int a=10,b=20;
 swap(&a,&b);
 printf(“a= %d b= %d”,a,b);
}

Вывод:
a = 20 b = 10.
Теперь посмотрим, как это происходит, шаг за шагом.

* c = 10 и * d = 20.

Подробное объяснение приводится ниже. Обратитесь к изображению выше для большей ясности.

I .temp = * c означает, что мы присваиваем значение переменной, адрес которой находится в c (т. е. «a», который равен 10).

temp = 10 сейчас.

II. Когда * d присваивается * c

  1. Сначала перейдите по адресу d, который держит 2000 (адрес b).
  2. Теперь получите значение 2000, равное 20 (то есть b).
  3. Теперь перейдите к удерживаемому адресу «c», который равен 1000 (адрес a).
  4. Теперь присвойте a значение b (которое равно 20).

а = 20 сейчас.

III. Аналогично * d = temp.

  1. Сначала получите значение при температуре, равное 10.
  2. Теперь перейдите по адресу d холдинга, который равен 2000 (адрес b).
  3. измените значение b на temp, равное 20.

b = 10 сейчас.

Таким образом,
a = 20 & b = 10. Мы ясно видим, что значения поменялись местами.

Висячий указатель:

Если адрес, на который указывает указатель, больше не доступен в памяти, этот указатель называется висячим указателем.

Нулевой указатель:
Нулевому указателю присваивается зарезервированное значение, которое говорит нам, что указатель ни на что не указывает.

int * ptr = NULL;
При назначении указателя на null вы просто говорите, что он ни на что не указывает.

Разница между висячим и нулевым указателем:

Чтобы было понятнее, возьмем пример.

Предположим, вы - указатель, и перед вами стоит связка яблок, пронумерованных от 1 до n. Яблоко, на которое вы смотрите, может выбрать только ваш гуру.

Ваш гуру приказал вам взглянуть на яблоко номер 10. Когда вы смотрите на конкретное яблоко, ваши глаза фиксируются на нем. На другие яблоки пока смотреть нельзя.

Сценарий 1:
Предположим, гуру прервал вас и поставил между вами и яблоком препятствие, так что вы больше не можете видеть свое яблоко. Теперь вы пытаетесь посмотреть на яблоко номер 10, но больше не можете этого делать.

Сценарий 2:
Предположим, вы пока слепой (без обид :)). Теперь ты даже яблока не видишь. Это означает, что по умолчанию вы ничего не видите. Но позже вы можете посмотреть на яблоко с помощью мантры гуру .. :-p.

Теперь рассмотрим оба сценария:
В «Сценарии 1» вы на самом деле являетесь висящим указателем. Даже если раньше вы смотрели на яблоко 10, но теперь не можете. Но по указанию гуру вы можете смотреть на другие яблоки.

В «Сценарии 2» вы фактически являетесь нулевым указателем. Вы слепы. Вы даже не можете ни на что смотреть. Но с помощью мантры гуру вы можете смотреть в глаза, а по указанию гуру вы можете смотреть на определенное яблоко.

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

К настоящему времени вы знаете, как работают указатели и их необходимость в программировании. Вы готовы играть с указателями 🔥 😎

Если этот пост был полезен, нажмите кнопку 👏 ниже, чтобы выразить свою поддержку!

Спасибо за чтение 👍. Дайте мне знать, если у вас есть отзывы.

почта: [email protected]
LinkedIn: Venkatesh Ellaboina