Изучение Си (урок 4)

X

Xamil

Original poster
Указатели
Указатели одна из важных тем в программировании, поэтому нужно хорошо понять , как работают указатели и как из испльзовать.
Для начала вспомним, что память компьютера состоит из миллионов ячеек, и каждой ячейке присовен адрес.
ПРостой пример. Создавая переменную rate компилятор выделит для нее ячейку памяти с адресом 1000.Если мы создали ее с типом int то след ячейка будет на 4 байта младше .т.е .1004.
Создание указателей
Заметим, что адрес переменной rate - это просто число и с ним можно обращаться как с обычным числовым значением.Зная адрес переменной , можно завести вторую переменную и поместить в нее адрес первой . Первый шаг в этой функции - это объявить переменную для хранения адреса переменной rate назовем ее p_rate
Но никакое значение туда не помещается .
Чтобы поместить туда адрес нужно объявить указатель.
C:
int *p_rate;
int rate = 100;
p_rate = &rate;
теперь посмотрим что будет выводиться на экран

C:
printf("%d\n", rate);    //100
printf("%d\n", &rate);    //10004
printf("%d\n", &p_rate);//10000
printf("%d\n", p_rate); //10004
printf("%d\n", *p_rate); //100

Указатели и Массивы
Имя массива как указатель. Имя массива без квадратных скобок является указателем на первый элемент массива.Например ,если объявлен массив data[], то data - это адрес первого элемента данного тобой массива.
В языке С справедливо соотношение (data == &data[0]) поэтому для получения адреса не нужно ставить амерсанд перед именем.
Размещение элементов массива в памяти
простой пример с типом short
есть переменная short array[6], в памяти они будут расположены
|100--101|--|102--103|--|104--105|--|106--107|--|108--109|--|110--111|
x[0]------------x[1]------------x[2]------------x[3]------------x[4]------------x[5]

тоже самое произоедет с типом float,но там уже значение x[0] имела бы диапазон 4 ячейки. от 100 до 103

Инкрементирование указателей
Инкрементировать указатель, ознаачант увеличивать его значение.Если значение указателя инкрементируется на 1 , адресная арифметика автоматически увеличивает хранимый адрес так, чтобы он указывал на следующий элемент массива.Другими словами , компилятор знает тип указателя и увеличивает хранимый в нем адрес на длинуу элемента данных.
Предположим ptr_sh является указателем на какой-то элемент массива тип short. И выполнится оператор ptr_sh++;
в резцльтате значение ptr_sh увеличится на длину типа short - 2 байта - и указатель теперь будет указывать на след элемент массива. если будет выполнен оператор
ptr_sh +=4; то указатель будет указывать на элемент, находящийся на 4 позиции дальше:
декрементирование указателей
тоже самое что и инкрементироване, но только в обратную сторону
Другие операзии с указателями
Еще одна полезная операция - это вычисление смещения.Вычитание двух указателей.Если есть два указателя на разные элементы одного массива, то их можно вычесть друг из друга и выяснить на каком расстоянии они находятся друг от друга.
ptr1-ptr2
Указатели также можно сравнивать.Сравнение имеет смысл только для указателей на один и тот же массив. При соблюдении этих условий операции сравнеиня выполняются корректно.Младшие элементы массива всегда имеют именьшие адреса , чем старшие элементы.Таким образом , если ptr1 и ptr2 указывае=ют на элемент одного массива , то следующее соотношение истинно тогда, когда ptr1 указывает на элемент с меньшим индексом , чем ptr2
ptr1 < ptr2
 
  • Like
Реакции: Ltybcrf

Название темы