Затерянный в мире указателей - PullRequest
0 голосов
/ 28 сентября 2018

Пожалуйста, помогите мне, я не могу понять, как работает этот код.Я просто не могу представить себе это в своей голове.Подробное объяснение может избавить меня от проблемы неудачи в жизни в будущем. Спасибо.

int **data = new int*[row];

    for(i=0;i<row;i++)
        data[i] = new int[col];

    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            data[i][j] = rand() % u;
        }
    }

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018
// "int **data": declare a variable that store address of anthor address storing variables i.e. declare a pointer(*) to anther pointer(*)
// [addr of *data](data)-->[addr of **data](*data)-->[actual value](**data)
// "int **data = new int*[row]": initialize data with address of the first
// element(which is again a pointer) of the array of length 'row' and int*
// indicates that this array is an array of integer pointers(i.e. each element in this array stores address of another 1-D array containing integers.)
int **data = new int*[row];

// Now traverse through each element of the array whos address is stored
// in the data variable i.e. if you do printf(data), it will print out the
// the address of the first element of this array pointed by data. While traversing, initialize each element of this array with addresses of new array(hence data points to array and each element in this array points to another array forming a 2-D array or matrix)
for(i=0;i<row;i++)
    data[i] = new int[col];

// Rest should be obvious.
for(i=0;i<row;i++)
{
    for(j=0;j<col;j++)
    {
        data[i][j] = rand() % u;
    }
}

// Feel free to ask questions if this still does not make sence.
// Also my C knowledge is a bit rusty so corrections are always welcome.
0 голосов
/ 28 сентября 2018

указатель - это, по сути, переменная, которая содержит адрес памяти объекта.Тип объекта в вашем случае 'int'.

memory:

00000000: [some value] -- start
...
pointer : [address1] pointer to int (int*) +
...                                        |
address1: [value of int] <-----------------+

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

memory:

00000000: [some value] -- start
...
pointer : [address1] pointer to int (int**) ----+
...                                             |
address1 : [address2] pointer to int (int*) + <-+
...                                         |
address2: [value of int] <------------------+

Теперь, чтовы сделали, вы присвоили массив указателей на int размером строки

  memory:

00000000: [some value] -- start
...
pointer : [address1] pointer to int (int**) -----+
...                                              |
address1 : [address-a] pointer to int (int*) + <-+
address2 : [address-b] pointer to int (int*) 
address3 : [address-c] pointer to int (int*) 
address4 : [address-d] pointer to int (int*) 
address5 : [address-e] pointer to int (int*) +
...                                          |
address-e: [value of int] <------------------+
...
address-b:...

надеюсь, это помогло

0 голосов
/ 28 сентября 2018
#include <cstddef>  // std::size_t
#include <cstdlib>  // std::srand(), std::rand()
#include <ctime>    // std::time()

int main()
{
    // Initialize the random number generator with the current time.
    // If you don't, std::rand() behaves as if std::srand(1) had been called.
    std::srand(static_cast<unsigned>(time(nullptr)));

    std::size_t rows =  5;
    std::size_t cols = 10;
    int u = 100;

    int **data =  // data is a pointer to a pointer to int
        new int*[rows];  // allocates an array of type int* with size of row
                         // and return a pointer to it

    for (std::size_t i = 0; i < rows; i++)
        data[i] =  // every pointer in that array is assigned
            new int[cols];  // a pointer to an array of type int with size col

    for (std::size_t i = 0; i < rows; i++)  // walk through the (int**) in data
    {
        for (std::size_t j = 0; j < cols; j++)  // walk through the (int*) in data[i]
        {
            data[i][j] = std::rand() % u;  // access the j th int in data[i]
        }
    }

    // free the memory, when you are done using it *):
    for (std::size_t i = 0; i < rows; i++)
        delete[] data[i];
    delete[] data;
}

*) Лучше: используйте умные указатели, такие как std::unique_ptr и std::shared_ptr, так что вам не нужно заботиться об управлении ресурсами:

#include <memory>

// ...

auto data = std::make_unique<std::unique_ptr<int[]>[]>(rows);

for (std::size_t i = 0; i < rows; i++)
    data[i] = std::make_unique<int[]>(cols);

Еще лучше: используйте контейнеры, такие как std::vector или std::deque.

...