Здесь указатель
Сравнение указателей, которые не ссылаются на элементы одного и того же массива, в общем случае некорректно и часто приводит к возникновению ошибок. Никогда не стоит полагаться на то, что различные объекты будут размещены в памяти каким-то определенным образом (где-то рядом) или на то, что все компиляторы и операционные среды будут обрабатывать ваши данные одинаково. Поэтому любое сравнение указателей, которые ссылаются на различные объекты, может привести к неожиданным последствиям. Рассмотрим пример.
char s[80];
char у[80];
char *p1, *р2;
p1 = s;
р2 = у;
if(p1 < р2) . . .
Здесь используется некорректное сравнение указателей, поскольку C++ не дает никаких гарантий относительно размещения переменных в памяти. Ваш код должен быть написан таким образом, чтобы он работал одинаково устойчиво вне зависимости от того, где расположены данные в памяти.
Было бы ошибкой предполагать, что два объявленных массива будут расположены в памяти "плечом к плечу", и поэтому можно обращаться к ним путем индексирования их с помощью одного и того же указателя. Предположение о том, что инкрементируемый указатель после выхода за границы первого массива станет ссылаться на второй, совершенно ни на чем не основано и потому неверно. Рассмотрим этот пример внимательно.
int first[101;
int second[10];
int *p, t;
p = first;
for(t=0; t<20; ++t) {
*p = t;
p++;
}
Цель этой программы — инициализировать элементы массивов
Следующая (некорректная) программа должна принять строку, введенную с клавиатуры, а затем отобразить
// Эта программа некорректна.
#include
#include
#include
using namespace std;
int main()
{
char s [80];
char *p1;
p1 = s;
do {
cout << "Введите строку: ";
gets(p1); // Считываем строку.
// Выводим ASCII-значения каждого символа.
while(*p1) cout << (int) *p1++ << ' ';
cout << ' \n';
}while(strcmp (s, "конец"));
return 0;
}
Сможете ли вы сами найти здесь ошибку?
В приведенном выше варианте программы указателю
Вот как выглядит корректный вариант той же программы.
// Эта программа корректна.
#include
#include
#include
using namespace std;
int main()
{
char s[80];
char *p1;
do {
p1 = s; // Устанавливаем p1 при каждой итерации цикла.
cout << "Введите строку: ";
gets(p1); // Считываем строку.
// Выводим ASCII-значения каждого символа.