Консультация № 72923
27.01.2007, 21:33
0.00 руб.
0 4 4
Растолкуйте мне пожалуйста суть масива указателей.
Это типа каждый елемент выступает указателем, и с ним можно делать все то-же самое что и с обычним указателем. Но тогда следующий вопрос. Если написать

char *array[]={"a","b","b"};

то тогда что на что будет указывать???????

Обсуждение

Неизвестный
27.01.2007, 21:46
общий
это ответ
Здравствуйте, Platon!

Вот схема памяти:

array-> array[0] array[1] array[2]
array[0] -> "a"
array[1] -> "b"
array[2] -> "b"

Массив суть указатель на первый элемент последовательности элементов одинакового размера.

Двойные кавычки (") означают указатель на последовательность байтов, оканчивающуюся байтом со значением 0.

Объявление вида
тип_переменной имя_переменной[]
объявляет массив из элементов, тип которых есть тип_переменной
В Вашем случае тип_переменной есть char*, т.е. указатель на char

Для упражнения: осознайте суть объявлений:
а) char** array[]
б) char*** array[]
и т.д.

а) - каждый элемент массива есть указатель на char*, т.е. указатель на указатель на char.
а) - каждый элемент массива есть указатель на char**, т.е. указатель на указатель на указатель на char.

Во всех случаях *array есть первый элемент массива, его тип совпадает с тем, что указано перед array в объявлении.
Неизвестный
27.01.2007, 22:56
общий
это ответ
Здравствуйте, Platon!
Тогда array - масив указателей на char из 3х элементов, проинициализированных указанными значениями -"a", "b", "c"
array[0]=="a" типа char*
array[1]=="b" типа char*
array[2]=="b" типа char*
Далее, в зависимости от настроек компилятора, array[1] и array[2] могут указывать на одну область памяти, выделенную под строку "b"
В общем array[i] можно использовать везде где требуется указатель на char
Неизвестный
28.01.2007, 10:21
общий
это ответ
Здравствуйте, Platon!
Вы, как и многие из начинающих С++ программистов столкнулись со сложность реализации строк. Видете ли строка в С++ это указатель по сути дела на первый символ этой сторки. Вообще говоря это массив символов по сути дела. Рассмотрим пример.
int *p = new int[3];
Обращаться к элементу можно так: p[index] или так *(p + index)
Как мы видим здесь оператор new выделяет три свободных подряд идущих ячеек и возвращает указатель на первую из них. На самом деле в С++ char - это не символ, это целочисленный тип, отличающийся только своим границами - 0..255, и если мы сделаем
char *p = new char[3];
То тоже будет массив целых чисел. Строка в С++ это массив целых чисел, последним элементом которго является символ ‘\0‘ (если мы пишем в апострофах, то это символ), его значение в виде целого числа 0 и называется он символ конца строки.
Вот пример:
char *s = new char[3];
s[0] = ‘a‘;
s[1] = ‘b‘;
s[2] = ‘\0‘;
Так мы получили строку "ab".
Тогоже самого можно добиться написав char *s = "ab"; НО здесь разница в том, что элементы этой строки изменять нельзя. Надо помнить что s - это указатель на первый символ. Используя операцию разименовывания вы сами можете в этом убедиться. Т.е.:
char *s = "ab";
char f = *s;
Значение f в этом случае будет равно ‘a‘.

Вернемся к Вашему примеру. У Вас действительно массив указателей и каждый из указателей указывает на первый символ строки.
array[0] - это указатель на первый символ строки "a" т.е. указатель на первую ячейку массива ‘a‘ ‘\0‘ из двух элементов. Если вы передадите этот указатель какой либо функции для работы со строками, то она считывает строку следующим образом: берет указатель array[0], разименовывает, и получает значение первого символа: *array[0]. Далее берется следующий символ: *(array[0] + 1) и так далее пока некоторое значенеи *(array[0] + index) не станет равным ‘\0‘, т.е. встретиться конец строки.
Неизвестный
28.01.2007, 11:04
общий
это ответ
Здравствуйте, Platon!
В записи char *array[]={"a","b","b"};
массив указателей array будет содержать
ТРИ указателя соответственно на строки "a","b","b".
Причем указатели на 2-ю и третью строки будут
разные, хотя эти строки будут содержать одинаковые элементы.
Удачи!

Форма ответа