Шаг 58.
Microsoft Visual C++ 2010. Язык С/С++.
Указатели и структуры данных. Массивы указателей

    На этом шаге мы рассмотрим особенности использования таких массивов.

    Мы видели, что с помощью массива, объявленного, например, как char M[n][m], можно задавать множество символьных строк постоянной длины. Однако в жизни чаще всего приходится работать со строками переменной длины. Тогда жесткая конструкция двумерного массива для и хранения не подойдет.

    Для решения этой проблемы существует конструкция, называемая массивом указателей. Создается одномерный массив, элементами которого служат указатели на заданный тип данных. Например, массив char* s[10]; - это десять указателей (s[0], s[1], ..., s[9]), каждый из них указывает на строку, которая может быть переменной длины.

    Такой массив формируется так: в некоторой памяти размещается первая строка, ее адрес заносится в s[0]. Затем размещается вторая строка, ее адрес заносится в s[1] и т. д. Чтобы обратиться к элементам такого массива, нужно воспользоваться определением указателя. Обратиться к нулевому элемент нулевой строки следует как *s[0], к первому элементу той же строки как *s[0]++ и т.д. К нулевому элементу первой строки нужно обратиться как *s[1], к ее первому элементу как *s[1]++ и т. д.

    Ициализация массива указателей на строки символов, например, char* s[3]; будет выглядеть так:

  char *s[3]={"Первая строка символов", 
    "Вторая строка символов", "Третья строка символов"};

    В чем же различие между записями, например, char n[10][20] и char* b[10]?

    Под первый вариант компилятор выделяет 200 единиц памяти. И поиск элемента этого массива производится путем вычисления обычных прямоугольных индексов. При втором варианте (если предположить, что и там строки содержат по 20 элементов) под них также будет выделено 200 единиц памяти, но еще понадобится память для хранения десяти указателей. То есть памяти при втором варианте размещения данных требуется больше. Но это неудобство перекрывается тем, что в таких конструкциях можно хранить строки переменной длины, и что доступ к таким строкам происходит напрямую - по их адресам, без вычисления индексов массивов.

    Более подробную информацию по этому вопросу можно получить здесь.

    На следующем шаге мы рассмотрим указатели на функции.




Предыдущий шаг Содержание Следующий шаг