Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Связь указателей и массивов

Читайте также:
  1. Артерии. Классификация. Развитие, строение и функции артерий. Взаимосвязь строения оболочек артерий и гемодинамических условий. Возрастные изменения.
  2. Важная связь между мыслями и чувствами
  3. Взаимосвязь вербальных и невербальных средств общения.
  4. Взаимосвязь внутренних переменных
  5. Взаимосвязь живой и неживой природы
  6. Взаимосвязь качества и надежности.
  7. Взаимосвязь между духовными и земными семьями

Указатели и массивы в языке С++ тесно связаны. Имя массива можно

рассматривать как константный указатель на его первый элемент (имя массива в выражении компилятор всегда заменяет адресом этого массива), поэтому справедливо следующее:

int arr[25], *ptr;

ptr = arr;

Это же можно записать и так:

ptr = &arr[0];

Доступ к элементу массива можно осуществить двумя способами:

arr[i] или *(ptr+i)

Более того компилятор всегда выражение arr[i] тупо приводит к виду *(arr+i), а затем проверяет его правильность. Поскольку при выполнении сложения с указателем от перестановки слагаемых ничего не меняется, то проходят следующие записи:

arr[i] i[arr] *(arr+i) *(i+arr) *(ptr+i) *(i+ptr) ptr[i] i[ptr]

Конечно конструкции типа i[arr] использовать не следует.

Для двухмерного массива будут справедливы следующие выражения:

int m[10][10];

m[i][j] *(m[i]+j) *(*(m+i)+j) (*(m+i))[j]

Это справедливо, поскольку все массивы в языке С++ рассматриваются как

одномерные. m[i] и *(m+i) являются строками (одномерными массивами), следовательно являются указателями (как мы уже рассматривали выше имя массива и указатель почти одно и тоже).

Свободные массивы

Теперь, когда мы знаем, что такое указатель, можно использовать и такой способ задания строк:

char * string1 = "Exit";

Указатель string1 указывает на начало памяти, выделенной для строки-литерала "Exit".

Этот способ задания строк удобно использовать для задания свободных массивов строк. Свободными массивами будем называть такие массивы или матрицы, размер каждой из строк которых может быть различным.

Свободный массив строк может быть задан следующим образом

char * menu[] = { "Тетрис",

"Пентамино",

"15",

"Выход" };

В данном случае будет сформирован массив из 4 указателей, указывающих на начало соответствующих строк-литералов. Строки такого меню можно вывести на

экран следующим образом:

Int i;

for (i=0;i<4;i++)

printf("%s\n",menu[i]);

Объем памяти для хранения такого массива равен в точности сумме всех

символов строк, включая и завершающие символы "пусто", плюс память,

Необходимая для хранения массива указателей.

Техника обращения к элементам "свободного" массива внешне ничем не

отличается от обращения к элементам "нормального" массива. Например

справедливы следующие выражения:

menu[i] - i-ая строка

*(menu+i) - i-ая строка

menu[i][j] - j-ый элемент в i-ой строке

*(*(menu+i)+j) - j-ый элемент в i-ой строке

Этот пример демонстрирует создание свободного массива на этапе компиляции.

Ниже демонстрируется создание динамического (свободного) массива с помощью операции new на этапе выполнения программы.


Дата добавления: 2015-07-07; просмотров: 151 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Объявление (определение) указателя| Int nRow, nCol;

mybiblioteka.su - 2015-2024 год. (0.007 сек.)