Часто встречаю вот такую конструкцию: 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++ обычно ручное управление памятью не приветствуется, поэтому там кратные указатели встречаются куда реже.
Комментариев нет:
Отправить комментарий