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

Если вы знакомы с указателями и массивами, вот краткое изложение этого блога.

  1. arr[] -> Любопытная особенность C заключается в том, что упоминание имени массива в большинстве контекстов заставляет компилятор обработать как если бы это был указатель на первый элемент. (Спасибо парню из devto)
  2. arr[0] = * (arr + 0) = * arr, здесь + не десятичная арифметика, а арифметика указателя. Вот почему индекс начинается с 0.

Для получения более подробной информации, пожалуйста!
Единственное, что вы должны знать, чтобы понять,

& — означает адрес
* — означает значение по этому адресу
%pописатель формата, используемый для печати адреса

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

Мы поймем, что означают & и *, с помощью простой программы на C.

#include <stdio.h>
int main() {
    int value = 10 ;
    int * addressOfValue = &value;
    printf("Initial Address %p\n", addressOfValue);
    printf("After Adding 1 %p", addressOfValue + 1);
    printf("Value %d", *addressOfValue);
    return 0;
}

Выход

Initial Address 0x7ffc1c122f1c
After Adding 1 0x7ffc1c122f20
Value 10

Разбивка кода

  • value — это переменная типа int, содержащая 10
  • Размер value составляет 4 байта.
  • addressOfValue является типом (int *). Это означает, что addressOfValue содержит адрес целочисленной переменной.
  • Размер addressOfValue составляет 4 байта (размер переменной указателя).
  • &value — адрес значения. Мы присваиваем адрес целочисленной переменной addressOfValue

Для большей ясности давайте преобразуем шестнадцатеричное число выше в десятичное.

0x7ffcb63b6e7c = 140720779439900
0x7ffcb63b6e80 = 140720779439904

мы использовали оператор value of (*) для печати значения по адресу. это 10

Когда мы проверяем адрес, разница составляет 4 байта. Мы добавили 1 к addressOfValue, это добавило 4 байта. Так что здесь сложение - это не числа, а размер значения (4 байта). мы называем это арифметикой указателя.

Если long int составляет 8 байт. Тогда добавление 1 к адресу добавит 8 байт.

0x7ffcb63b6e7c + 0 = 140720779439900
0x7ffcb63b6e7c + 1 = 140720779439904

Магия массивов и указателей

Ниже приведен простой цикл Array for, где индекс начинается с 0. Вы поняли, к чему я иду... см. следующий фрагмент кода.

#include <stdio.h>
int main() {
   int arr[] = {1 , 2 , 3 };
   int arrSize = 3;           
   for ( int ind = 0 ; ind < arrSize ; ind ++) {
       printf("%d ", arr[ind]);
   }
   return 0;
}
// Output
// 1 2 3

Я изменю приведенный выше код с помощью указателей.

#include <stdio.h>
int main() {
   int arr[] = {1 , 2 , 3 };
   int arrSize = 3;           
   int * arrPointer = arr;
   for ( int ind = 0 ; ind < arrSize ; ind ++) {
       printf("%d ", * ( arrPointer + ind ) );
   }
   return 0;
}
// Output
// 1 2 3

Разбивка кода

  • arrPointer получает адрес arr. Обратите внимание, что мы не использовали оператор &, потому что arr сам по себе является специальным указателем, указывающим на первый элемент в множество
  • Мы изменили printf, который * (arrPointer + ind)
* (0x7ffcb63b6e7c + 0) = *(140720779439900) = 1 
 * (0x7ffcb63b6e7c + 1) = *(140720779439904) = 2 
 * (0x7ffcb63b6e7c + 2) = *(140720779439908) = 3

Точнее, вот что происходит:
arr[ind] = *(arr + ind)

#include <stdio.h>
int main() {
   int arr[] = {1 , 2 , 3 };
   int arrSize = 3;           
   for ( int ind = 0 ; ind < arrSize ; ind ++) {
       printf("%d ", * ( arr + ind ) );
   }
   return 0;
}
// Output
// 1 2 3

мир🕊

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

Можно приготовить напиток Пахта 🥛. Небольшая поддержка имеет большое значение!

Подпишитесь Если хотите получать эти блоги на почту от @Medium бесплатно!

Еще от меня