Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Указатель на указатель - что это?

Часто встречаю вот такую конструкцию: int ** p; Я так понимаю, что это указатель на указатель. Зачем такая двойственность нужна и где применяется?


Ответ

Указатель в C — не семантика, а механизм. Он сам по себе не несёт смысла, но может использоваться для выражения того или иного смысла. То же относится и к двойному указателю: он может использоваться для разных вещей. Вот несколько примеров.
В C параметры передаются по значению, то есть из коробки нету передачи параметров «по ссылке» (они же &-параметры C++, они же ref-/out-параметры C#). Для того, чтобы объявить такой параметр, пользуются указателем на фактический параметр (то есть, передают в функцию адрес параметра). Если тип самого параметра — указатель, получается двойной указатель. Пример:
void split_half(char* input, char** first_half, char** second_half) { var len = strlen(input); var halflen = len / 2; *first_half = malloc(halflen + 1); strncpy(*first_half, input, halflen); (*firsthalf)[halflen] = 0; *second_half = strdup(&input[halflen]); } В C указатель может обозначать массив. Если тип элемента массива — указатель, получается двойной указатель. Классический пример:
int main(int argc, char** argv) { ... } Двойной указатель можно использовать для массива массивов. Например, квадратная матрица:
struct matrix { int** data; int width; int height; }
void init_matrix(int width, int height, struct matrix* matrix) { matrix->width = width; matrix->height = height; matrix->data = malloc(height * sizeof(int*)); for (int y = 0; y < height; y++) matrix->data[y] = malloc(width * sizeof(int)); }

В C++ обычно ручное управление памятью не приветствуется, поэтому там кратные указатели встречаются куда реже.

Комментариев нет:

Отправить комментарий