2015-05-31 7 views
0

В этом примере У меня есть массив из четырех элементов. Я объявил указатель на целое число, которое содержит адрес массива. Затем я показал адрес 0-го индекса тремя разными способами. Аналогично, адрес 1-го индекса отображается тремя различными способами. Когда я выдаю это (pNumbers) +0, его можно понять, что будет отображаться уникальный и другой адрес. В следующей строке * (& pNumbers + 0) отображает 0-й индексный адрес (так как он содержит указатель). Теперь возникает проблема. При выводе этой строки (pNumbers) +1 линия снова отображает массив 0-го индекса. Зачем ?Когда я добавляю свой адрес указателя, он указывает на мой массив? Зачем? Справочная и разуменная путаница C++

первый вопрос: Когда я получаю адрес указателя (& 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

'предположение было равно 31 (но отображение некоторого 0x1f)' 0x1f в hexdecimal ** равно ** 31 в десятичной системе. – PaulMcKenzie

+0

Я бы предположил, что это потому, что pNumbers находится в стеке прямо перед номерами [], это будет зависящим от компилятора, и действительно, когда я его запускаю, я вижу другой вывод. –

+0

И для вашего второго вопроса число 28 в базе десять * * такое же число, как 0x1C в шестнадцатеричном формате. Они равны. –

ответ

0

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

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

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

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

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

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

+0

Спасибо за ответ :) Я в значительной степени понял причину второго вопроса. Но я все еще немного застрял в вопросе 1. – user1155921

+0

Над строкой 'int * pNumbers = number;' добавьте еще одну строку 'int x = 0;' и посмотрите, что '(& pNumbers) + 1'. Он будет таким же, как '& x' (на вашей особой архитектуре). Итак, '& pNumbers + 1' указывает на то, что было в вашем стеке, объявленное до' pNumbers'. – robal

+0

Yikes, я боюсь, что это не так, как вы сказали в своем объяснении. номер [0] Адрес 0x28fee0, число [1] Адрес 0x28fee4, номер [2] Адрес 0x28fee8, номер [3] Адрес 0x28feec, & pNumbers Адрес 0x28fedc, & х адрес 0x28fed8, (& pNumbers) + 1 адрес 0x28fee0, – user1155921

 Смежные вопросы

  • Нет связанных вопросов^_^