Рассмотрим следующие операторы:
int *pFarr, *pVarr;
int farr[3] = {11,22,33};
int varr[3] = {7,8,9};
pFarr = &(farr[0]);
pVarr = varr;
На этом этапе оба указателя указывают на начало каждого соответствующего адреса массива.Для * pFarr мы сейчас смотрим на 11, а для * pVarr - 7.
Точно так же, если я запрашиваю содержимое каждого массива через * farr и * varr, я также получаю 11 и 7.
Пока все хорошо.
Теперь давайте попробуем pFarr++
и pVarr++
.Отлично.Сейчас мы смотрим на 22 и 8, как и ожидалось.
Но сейчас ...
Пытаясь подняться на farr++
и varr++
... и мы получим "неправильный тип"аргумента для приращения ".
Теперь я распознаю разницу между указателем массива и обычным указателем, но поскольку их поведение схоже, почему это ограничение?
Это еще больше сбивает меня с толкукогда я также считаю, что в той же программе я могу вызывать следующую функцию якобы правильным и другим неправильным образом, и я получаю такое же поведение, хотя в отличие от того, что произошло в коде, размещенном выше!?
working_on_pointers ( pFarr, farr ); // calling with expected parameters
working_on_pointers ( farr, pFarr ); // calling with inverted parameters
.
void working_on_pointers ( int *pExpect, int aExpect[] ) {
printf("%i", *pExpect); // displays the contents of pExpect ok
printf("%i", *aExpect); // displays the contents of aExpect ok
pExpect++; // no warnings or errors
aExpect++; // no warnings or errors
printf("%i", *pExpect); // displays the next element or an overflow element (with no errors)
printf("%i", *aExpect); // displays the next element or an overflow element (with no errors)
}
Может ли кто-нибудь помочь мне понять, почему указатели и указатели массивов ведут себя одинаково в одних контекстах, но отличаются в других?
Огромное спасибо.
РЕДАКТИРОВАТЬ: Новички, как я, могли бы дополнительно извлечь выгоду из этого ресурса: http://www.panix.com/~elflord/cpp/gotchas/index.shtml