Когда я добавляю в мой адрес указателя, это указывает на мой массив? Зачем? Переполнение ссылок и разыменований Переполнение стека

В этом примере
У меня есть массив из четырех элементов. Я объявил указатель на целое число, которое содержит адрес массива. Затем я отобразил адрес 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;
}

0

Решение

это макет памяти вашего стека на большинстве платформ.
ваш стек

На выходе это (&pNumbers) +1 строка снова отображает 0-й индекс массива. Зачем ?

Ваш код получает адрес pNumbers ячейка памяти (тип &pNumbers является int **), затем добавляет единицу, семантика которой должна увеличивать его на размер указателя, поэтому выражение &pNumbers + 1 адрес вашего исходного массива как pNumbers переменная сама по себе является указателем.

На ваш второй вопрос, какое выражение *(&pNumbers+1) делает в основном пытается интерпретировать местоположение памяти, которая хранит int как указатель на int (тип *(&pNumbers+1) в int *). Это причина, по которой вы видите ваш int в шестнадцатеричном формате, а не в формате dec. Другими словами вы относитесь number[0] как int * и распечатай это.

Что может сбивать с толку во всем этом, так это то, что массив обрабатывается как указатель на его первый элемент, который вызывает number а также &number по сути один и тот же адрес (но оба выражения имеют разные типы)

Надежда может помочь.

0

Другие решения


По вопросам рекламы [email protected]