C/C++
Указатели в Си, зачем?
Зачем нужны указатели в Си? Может мне кто на постом примере показать как-то?
Для низкоуровневой работы с памятью.
Для имитации массивов (которых в C не существует).
Для имитации передачи параметров по ссылке (которой в C не существует).
Для работы с динамическими структурами данных (что есть и в других языках).
C - язык системного программирования. Соответственно, он умеет работать с железом на предельно низком уровне - включая прямую работу с оперативной памятью.
Для имитации массивов (которых в C не существует).
Для имитации передачи параметров по ссылке (которой в C не существует).
Для работы с динамическими структурами данных (что есть и в других языках).
C - язык системного программирования. Соответственно, он умеет работать с железом на предельно низком уровне - включая прямую работу с оперативной памятью.
Основной момент - работа с данными, количество которых заранее неизвестно. Допустим, твой пользователь вводит данные, пока не введет признак конца ввода. Куда ты будешь девать эти данные по мере ввода? Можно описать статический массив, но как угадать его размер?
Еще один пример - быстрая передача массивов данных в процедуры. Вместо того, чтобы забивать стек огромным количеством данных (которые могут туда и не поместиться), можно передать указатель на начало массива и адью.
Ну и всякие там коллбаки. Если твоя процедура должна вызвать другую процедуру, но ты заранее не знаешь, какую именно - как ты это сделаешь без указателя на нужную процедуру?
Еще один пример - быстрая передача массивов данных в процедуры. Вместо того, чтобы забивать стек огромным количеством данных (которые могут туда и не поместиться), можно передать указатель на начало массива и адью.
Ну и всякие там коллбаки. Если твоя процедура должна вызвать другую процедуру, но ты заранее не знаешь, какую именно - как ты это сделаешь без указателя на нужную процедуру?
Указатели - основа косвенной адресации данных, чрезвычайно мощного средства организации вычислений, используемого, например, для перебора данных, организации структур данных, передачи значений и т.д.
Простой пример - массив данных, который является лишь синтаксическим сахаром для косвенной адресации данных посредством указателей, а прямое применение указателей обнаружится в списках, деревьях и прочих сколько-то сложных структурах данных.
Простой пример - массив данных, который является лишь синтаксическим сахаром для косвенной адресации данных посредством указателей, а прямое применение указателей обнаружится в списках, деревьях и прочих сколько-то сложных структурах данных.
постом ....это много, хотя может тут простом.
Си наследник языка ассемблер, а они нужны были там, поэтому и тут они есть. Это тебе пойдет?
Си наследник языка ассемблер, а они нужны были там, поэтому и тут они есть. Это тебе пойдет?
Просто и на пальцах: указатели - это колдунство божественного уровня, которое позволяет творить просто потрясающие вещи. Но есть у него один серьезный недостаток - у него нет предохранителя. И когда это колдунство вместо прокаченного в полку архимага попадает в руки нубу, который только-только перешагнул порог первого уровня, он может ненароком такого натворить, что его программе мало не покажется. Бывает даже, что вместе с программой на респ отлетает и вся система. Поэтому все языки, которые появились после Си, так или иначе пытались ограничить разрушительную мощь, которая скрыта в этом заклинании, ибо архимагов вокруг гораздо меньше, чем нубасов. А уж если нубас еще и учится ничему не хочет то это все - финиш.
Первое правило, которое должен зарубить себе на носу каждый, кто собирается пользоваться мощью указателей гласит:
ЛЮБОЙ УКАЗАТЕЛЬ ДОЛЖЕН БЫТЬ ИНИЦИАЛИЗИРОВАН
Первое правило, которое должен зарубить себе на носу каждый, кто собирается пользоваться мощью указателей гласит:
ЛЮБОЙ УКАЗАТЕЛЬ ДОЛЖЕН БЫТЬ ИНИЦИАЛИЗИРОВАН
Указатели в Си - это переменные, которые хранят адреса других переменных. Их использование может быть очень полезным во многих случаях. Например, указатели могут использоваться для:
1) Динамического выделения памяти: Если вы не знаете заранее, сколько памяти вам нужно для хранения данных, вы можете выделить память во время выполнения программы. Для этого вы можете использовать функцию malloc(), которая выделяет блок памяти и возвращает указатель на начало этого блока. Например:
2) Передачи аргументов по ссылке: В Си все аргументы функций передаются по значению. Это означает, что функция получает копию каждого аргумента, а не сам аргумент. Однако вы можете передать адрес переменной в функцию в качестве аргумента и изменить значение этой переменной в функции. Например:
3) Работы с массивами: Указатели могут использоваться для доступа к элементам массива. В Си имя массива - это указатель на первый элемент массива. Например:
Указатели в Си могут быть очень мощным инструментом программирования, но также могут быть опасными, если они используются неправильно. Неправильное использование указателей может привести к ошибкам времени выполнения, таким как ошибки сегментации. Поэтому при работе с указателями важно быть внимательным.
1) Динамического выделения памяти: Если вы не знаете заранее, сколько памяти вам нужно для хранения данных, вы можете выделить память во время выполнения программы. Для этого вы можете использовать функцию malloc(), которая выделяет блок памяти и возвращает указатель на начало этого блока. Например:
int *ptr;
ptr = (int*) malloc(sizeof(int));
*ptr = 42;
Этот код выделяет память под одно целое число (sizeof(int) байт) и сохраняет его адрес в указателе ptr. Затем он использует указатель для сохранения значения 42 в выделенной памяти. 2) Передачи аргументов по ссылке: В Си все аргументы функций передаются по значению. Это означает, что функция получает копию каждого аргумента, а не сам аргумент. Однако вы можете передать адрес переменной в функцию в качестве аргумента и изменить значение этой переменной в функции. Например:
void increment(int *x) {
(*x)++;
}
int main() {
int a = 0;
increment(&a);
printf("%d\n", a); // выводит 1
return 0;
}
В этом примере функция increment() принимает указатель на целое число. Она разыменовывает указатель (с помощью оператора *) и увеличивает значение переменной, на которую указывает указатель. Затем она изменяет значение переменной a в функции main(), используя указатель.3) Работы с массивами: Указатели могут использоваться для доступа к элементам массива. В Си имя массива - это указатель на первый элемент массива. Например:
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("%d\n", *ptr); // выводит 1
printf("%d\n", *(ptr+2)); // выводит 3
В этом примере указатель ptr указывает на первый элемент массива arr. Мы можем получить доступ к элементам массива, используя указатель и оператор разыменования *. Указатели в Си могут быть очень мощным инструментом программирования, но также могут быть опасными, если они используются неправильно. Неправильное использование указателей может привести к ошибкам времени выполнения, таким как ошибки сегментации. Поэтому при работе с указателями важно быть внимательным.
Похожие вопросы
- Си!!! БЕЗ УКАЗАТЕЛЕЙ, ЯЗЫК СИ
- Указатель превращается в двумерный массив. (Си)
- Динамический массив и указатель Си
- Инкрементировать строки массива указателей. (Си)
- Различие указателей int *; и char *;
- Не совсем понял как работает C++ код с указателями
- Если указатель уже объявлен как указатель то при повторном объявлении мы обращаемся не к указателю а к адресу ссылки?
- Передача в метод класса указателя на функцию C++
- Написать программу в языке Си, которая с помощью указателей на функцию выполняет задание
- C/C++ Как устроена память, выделенная для структуры с указателем *next?
Вообще их лучше не использовать нубасам и тем более не использовать язык си.