c ++ массив указателей и распределение адресов памяти - PullRequest
1 голос
/ 01 мая 2020

Может кто-нибудь объяснить, как массив указателей реализации c ++ динамически?

Правильно ли приведенный ниже код?

Если это так,

 int *ptr[5]; 

 for (int i = 0; i < 5; i++)
  {

  int size = 2;

  ptr[i] = new int [size] ;

 //*(ptr + i) = new int[size]; this is the same as above line

  cout << &ptr[i] << endl;   ----------> line 1
  cout << ptr[i] << endl; -----------> line 2
  }

Что на самом деле печатает в строке 1 и 2?

это адреса, которые я получаю для строки 1

0x7fff88f805d0
0x7fff88f805d8
0x7fff88f805e0
0x7fff88f805e8
0x7fff88f805f0

это адреса, которые я получаю для строки 2

0x55f946348ef0
0x55f946349330
0x55f946349360
0x55f946349390
0x55f9463493c0

Может кто-нибудь объясните весь этот беспорядок в массивах указателей.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

enter image description here

На рисунке представлено графическое объяснение проблемы, если кто-то запутается с концепцией массива указателей с динамическим выделением массива указателей для нового типа int или любого другого тип массива


int *ptr[2]; // statically declared pointer array stack

    int p [2];

for (int i = 0; i < 2; i++)
      {
      int size = 2;

      ptr[i] = new int[size];
      cout << i << " array of int " << endl;
      //*(ptr + i) = new int[size];

      for (int j = 0; j < size; j++)
        {
        cout << "value : " ;
        cout << *(ptr[i] + j) ;  // <------- this should give 0's as value
        //cout << (ptr[i])[j] ; <------ same thing
        cout << "  address :";
        cout << ptr[i] + j << endl; //<----- these are in order as well since it's an array of type int

        }

      }
0 array of int 
value : 0  address :0x564c9ede32c0
value : 0  address :0x564c9ede32c4
value : 0  address :0x564c9ede32c8
1 array of int 
value : 0  address :0x564c9ede32e0
value : 0  address :0x564c9ede32e4
value : 0  address :0x564c9ede32e8
0 голосов
/ 01 мая 2020

Я предполагаю, что вы хотите выполнить операцию с массивом Dynami c, например, добавление элемента и печать; Помните : In int * ptr = new int [5]; sizeof (ptr) составляет 8 байт в памяти стека, а массив будет храниться в памяти кучи.

Мы будем извлекать элемент через указатель ptr, и каждый элемент будет выбираться в соответствии с типом массива (скажем, int), а затем ptr будет go к 0-му элементу индекса и будет считывать его данные как тип int (всего 4 байта, поскольку int обычно имеет 4 байта) и переходит к следующему индексу до конца. Посмотрите на код ниже:

#include <iostream>
using namespace std;

int main() {
int *ptr=new int[5]; //let size = 5
for(int i=0; i<5;i++){
cin>>ptr[i];
}
for(int i=0; i<5;i++){
cout<<&ptr[i]<<":";  //this will print every element's address per iteration
cout<<ptr[i]<<endl;  //this will print every element as per input you gave
}
delete []ptr; //remember it's not delete ptr ask if required
return 0;
}

Теперь посмотрите вывод и dry запустите себя, вы можете понять

Вывод

0x556999c63e70:1
0x556999c63e74:2
0x556999c63e78:3
0x556999c63e7c:4
0x556999c63e80:5

Преимущество динамического c массива состоит в том, что вы можете создавать динамический c размерный массив, принимая размер, введенный в соответствии с выбором пользователя, что переменная равна размеру динамического c массива, т.е. вы можете изменить размер, превышающий 5 = N, на переменную один.

Я думаю, что это может помочь вам, иначе вы можете попросить дальнейших разъяснений.

...