Самым первым языком, который я выучил, был C, и мне потребовались месяцы, чтобы понять указатели. Я никогда не могу забыть указатели в моей жизни.
Если вы знакомы с указателями и массивами, вот краткое изложение этого блога.
- arr[] -> Любопытная особенность C заключается в том, что упоминание имени массива в большинстве контекстов заставляет компилятор обработать как если бы это был указатель на первый элемент. (Спасибо парню из devto)
- 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 бесплатно!