Здесь используется массив целочисленных значений с именем
Хотя имя массива генерирует константу-указатель, на него, тем не менее, (подобно указателям) можно включать в выражения, если, конечно, оно при этом не модифицируется. Например следующая инструкция, при выполнении которой элементу
*(num+3) = 100; // Здесь все в порядке, поскольку num не изменяется.
Возможно, вас удивит способ обработки С++-компиляторами строковых литералов, подобных следующему.
cout << strlen("С++-компилятор");
Если С++-компилятор обнаруживает строковый литерал, он сохраняет его в таблице строк программы и генерирует указатель на нужную строку. Поэтому следующая программа совершенно корректна и при выполнении выводит на экран фразу:
#include
using namespace std;
int main()
{
char *s;
s = "Работа с указателями - сплошное удовольствие!\n";
cout << s;
return 0;
}
При выполнении этой программы символы, образующие строковый литерал, сохраняются в таблице строк, а переменной
Таблица строк —
Поскольку указатель на таблицу строк конкретной программы при использовании строкового литерала генерируется автоматически, то можно попытаться использовать этот факт для модификации содержимого данной таблицы. Однако такое решения вряд ли можно назвать удачным. Дело в том, что С++-компиляторы создают оптимизированные таблицы, в которых один строковый литерал может использоваться в двух (или больше) различных местах программы. Поэтому "насильственное" изменение строки может вызвать нежелательные побочные эффекты. Более того, строковые литералы представляют собой константы, и некоторые современные С++-компиляторы попросту не позволят менять их содержимое. А при попытке сделать это будет сгенерирована ошибка времени выполнения.
Выше отмечалось, что значение одного указателя можно сравнивать с другим. Но, чтобы сравнение указателей имело смысл, сравниваемые указатели должны быть каким-то образом связаны друг с другом. Чаще всего такая связь устанавливается в случае, когда оба указателя указывают на элементы одного и того же массива. Например, даны два указателя (с именами
Сравнение указателей демонстрируется в следующей программе. В этой программе создается две переменных типа указатель. Одна (с именем
// Пример сравнения указателей.
#include
using namespace std;
int main()
{
int num[10];
int *start, *end;
start = num;
end = #[9];
while(start <= end) {
cout << "Введите число: ";
cin >> *start;
start++;
}
start << num; /* Восстановление исходного значения указателя */
while(start <= end) {
cout << *start << ' ';
start++;
}
return 0;
}
Как показано в этой программе, поскольку