Массив указателей, указывающих на неизвестное местоположение - PullRequest
0 голосов
/ 09 ноября 2018

Я тренировался с множеством указателей. я написал простой код.

#include<iostream>
using namespace std;

int main(){

    int a[3]={1,2,3};
    int *b[3];

    for(int i=0; i<3; i++){
        b[i] = &a[i];
    }

    cout<<b; //This gives a confusing output
    cout<<endl;

    for(int i=0; i<3; i++){
        cout<<b[i];
        cout<<endl;
    }
}

и Выход равен

0x6ffe10
0x6ffe30
0x6ffe34
0x6ffe38

Теперь я не понимаю, куда указывает б. Я знаю, это звучит странно, но я хочу знать. где указатель b указывает. B [0], b [1], b [2] дает ожидаемый результат.

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

b - это массив указателей на int.Это адрес адрес первого указателя .

  • Первому указателю b[0] назначается адрес элемента a[0] (поэтому b[0] указывает на 1).
  • b[1] назначается адрес a[1] (поэтому b[1] указывает на 2)
  • b[2] назначается адресиз a[2] (поэтому b[2] указывает на 3)

В каждом случае указатель в массиве b содержит адрес соответствующего элемента в пределах a.Таким образом, если в элементе a будут сделаны какие-либо изменения после того, как ваш цикл назначит адрес в a для b, значение, хранящееся в ячейке памяти, на которую указывает элемент b, изменится, ноадрес для этого значения, хранящийся в b, останется неизменным.

0 голосов
/ 09 ноября 2018

b Адрес памяти всего массива.

0 голосов
/ 09 ноября 2018

Когда b передается оператору cout <<, он превращается в указатель; следовательно, что касается функции печати, распечатка b такая же, как распечатка &b[0].

Следовательно, cout << b; печатает адрес первого указателя в массиве b[3]. (Обратите внимание, что адрес указателя не совпадает с адресом, на который указывает указатель! Это может быть источником путаницы - просто имейте в виду, что переменная-указатель является переменной ну, и, как и любая другая переменная, она имеет свое уникальное местоположение в памяти, которое отличается от места, на которое она указывает)

0 голосов
/ 09 ноября 2018

b - это массив указателей на int, который является локальной переменной в стеке.

Его адрес не зависит от того, какие отдельные элементы его массива назначены.

Если вы напечатаете его значение до цикла for (где вы присваиваете значения его элементам), вы увидите, что оно совпадает со значением, напечатанным после for петля.

Смотрите демо-версию здесь .

Наглядно:

enter image description here

...