В этом примере
У меня есть массив из четырех элементов. Я объявил указатель на целое число, которое содержит адрес массива. Затем я отобразил адрес 0-го индекса тремя разными способами. Аналогично, адрес 1-го индекса отображается тремя разными способами. Когда я вывожу это (&pNumbers) +0 довольно понятно, что будет отображаться уникальный и другой адрес. В следующей строке * (&pNumbers + 0) отображает 0-ый индексный адрес (как его содержит указатель). Теперь проблемная часть приходит. На выходе это (&pNumbers) +1 строка снова отображает 0-й индекс массива. Зачем ?
Первый вопрос:
когда я получаю адрес указателей (&pNumbers), он отображает новый и уникальный адрес. Но когда я добавлю в этот адрес. Как он обращается к адресам элементов массива?
например
enter code here
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl // new address + 1 but showing address of 0 element.
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl // showing address of of 1st index
Второй вопрос:
Если сказать, что это как-то указывает на соответствующие элементы массива. По моей разыменовке почему не отображается правильное значение данных, соответствующее элементам массива.
например
enter code here
cout<<" *(&pNumbers+1) "<< *(&pNumbers+1) // assumption was 31 (but displaying some 0x1f)
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl // assumption was 28 (but displpaying 0x1c)
Ниже приведен исходный код:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{int number[] = { 31, 28, 31, 30};
int *pNumbers = number;
cout<<" Address of number[0] "<<number<<endl;
cout<<" Address of number[1] "<<number+1<<endl;
cout<<" Address of number[2] "<<number+2<<endl;
cout<<" Address of number[3] "<<number+3<<endl<<endl;
cout<<" Address of &pNumbers "<< &pNumbers<<endl<<endl; // address of pNumbers
cout<<" Address of number "<< number<<endl; // address of array's first element
cout<<" pNumber Address "<< pNumbers<<endl;
cout<<" &(pNumbers[0]) "<< &(pNumbers[0])<<endl<<endl;
cout << " pNumbers+1: " << pNumbers+1<<endl; //address of array's second element
cout<<" (&pNumbers[1]) "<<(&pNumbers[1])<<endl; //
cout<<" (pNumbers+1) "<< (pNumbers+1) <<endl<<endl;
cout<<" (&pNumbers)+0 "<< (&pNumbers)+0<<endl;
cout<<" *(&pNumbers+0) "<< *(&pNumbers+0)<<endl<<endl;
cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl<<endl; // new address + 1 expected but displaying array's 0th index address why ?
cout<<" *(&pNumbers+1) "<<*(&pNumbers+1)<<endl<<endl;
cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl<<endl;
cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl<<endl;
cout<<" (&pNumbers + 3) "<<(&pNumbers+3)<<endl<<endl;
cout<<" *(&pNumbers + 3) "<<*(&pNumbers+3)<<endl<<endl;
cout<<" (&pNumbers + 4) "<<(&pNumbers+4)<<endl<<endl;
cout<<" *(&pNumbers + 4) "<<*(&pNumbers+4)<<endl<<endl;
return 0;
}
это макет памяти вашего стека на большинстве платформ.
На выходе это (&pNumbers) +1 строка снова отображает 0-й индекс массива. Зачем ?
Ваш код получает адрес pNumbers
ячейка памяти (тип &pNumbers
является int **
), затем добавляет единицу, семантика которой должна увеличивать его на размер указателя, поэтому выражение &pNumbers + 1
адрес вашего исходного массива как pNumbers
переменная сама по себе является указателем.
На ваш второй вопрос, какое выражение *(&pNumbers+1)
делает в основном пытается интерпретировать местоположение памяти, которая хранит int
как указатель на int (тип *(&pNumbers+1)
в int *
). Это причина, по которой вы видите ваш int в шестнадцатеричном формате, а не в формате dec. Другими словами вы относитесь number[0]
как int *
и распечатай это.
Что может сбивать с толку во всем этом, так это то, что массив обрабатывается как указатель на его первый элемент, который вызывает number
а также &number
по сути один и тот же адрес (но оба выражения имеют разные типы)
Надежда может помочь.