*Указатели в языке Си - Часть 1

HexElf

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

(тип) *имя;

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

Пример работы указателя:

#include <stdio.h>

int main(void){
int x = 10;
int *p = &x;

printf("%d\n",*p);

return 0;
}


Здесь мы объявили переменную x со значением 10, после чего указатель *p ссылается на адрес x с помощью оператора & (амперсанд), который получает адрес. Оператор * используется для разыменования указателя, чтобы получить значение по этому адресу.

Интересные функции указателей.

1. Экономия памяти и времени. По сути мы передаём адреса вместо копий данных.

Без указателя: 0.003231 секунд
С указателем: 0.002782 секунд


Тест проводился на 1 000 000 элементов при передаче массива.

2. Изменять данные уже существующей переменной.

Пример:

#include <stdio.h>

int main(void){
int x = 10;
int *p = &x;

printf("%d\n",*p);

*p = 20;

printf("%d\n",*p);

return 0;
}



Результат:
10
20


3. Указатель на указатель. Используется, когда требуется работа с многомерными данными или изменение указателей внутри функции.

#include <stdio.h>

void chang_p(int **p_p, int *new_value){
*p_p = new_value;
}

int main(void){
int x = 10, y = 20;
int *p = &x;
int **p_p = &p;

printf("%d\n",*p);

chang_p(p_p, &y);

printf("%d\n",*p);

return 0;
}


Указатели это очень простая концепция, очень заваражующая, но требует очень много внимания, ибо дальнейшее изучение Си будет трудноватым. Вторая часть будет опубликована в зависимости от интереса к первой части. Во второй части я расскажу про нулевой указатель, массив и указатель, указатель и приведение типов, const указатель, универсальный указатель, а также о том, как правильно работать с ними, чтобы избежать утечек памяти или "висячих" указателей:Lll
 
Отредактировано автором:
Сверху