Создание массива указателей в C ++

Создание массива указателей в C Программирование и разработка

Массив указателей представляет собой массив переменных — указателей. Это также известно как массивы указателей. Мы обсудим, как создать 1D и 2D массив из указателей динамически. Слово динамический означает, что память выделяется во время выполнения, и она выделяет память в разделе кучи. В стеке память ограничена, но в зависимости от того, какой язык / ОС используется, средний размер составляет 1 МБ.

Динамический одномерный массив в C ++

Vассив указателей — это тип массива, который состоит из переменных типа указателя. Это означает, что эти переменные могут указывать на некоторые другие элементы массива.

Пример:

int *p[3];

// Now P[0], P[1], P[2] can point to int memory blocks.

В динамически выделяемом массиве размера N блок создается в куче и возвращает адрес первого блока памяти. Используя этот адрес, можно получить доступ к каждому элементу. С динамическим массивом в C ++ следует ознакомиться с новыми ключевыми словами или использовать malloc (), calloc ().

Синтаксис:

<dataType> * <pointer name> = new <dataType> [<size>];

Пример:

int *p = new int [5];

В динамически выделяемом массиве размера N блок

Доступ к элементам динамического массива

Создается одномерный массив размера N(= 5), и переменной P присваивается базовый адрес. Если записан приведенный ниже оператор, то на выходе будет 1000.

cout << p;

Если требуется значение в 1000- мадресе, разыменуйте его, используя символ * (звездочка), как показано ниже:

cout << *P;

// It is the same as P[0]. The output is 23.

Базовая арифметика указателя: Ниже приведены некоторые моменты, касающиеся арифметики указателя :

P = 1000 and 1 = sizeof(int) = 4 bytes.
Hence, *(1004) and dereferencing by * (asterisk) symbol. Now, the final result is 38.

Следовательно, * (1004) и разыменование с помощью символа * (звездочка). Теперь окончательный результат — 38.

P = 1000 and 1 = sizeof(int) = 4 bytes.
Hence, *(1004) and dereferencing by * (asterisk) symbol and then by adding 1 modifies the result to 23 + 1 = 24.

Следовательно, * (1004) и разыменование с помощью символа * (звездочка) с последующим добавлением 1 изменяет результат на 23 + 1 = 24.

Ниже приведена программа на C ++, чтобы проиллюстрировать вышеупомянутые концепции:

// C++ program to illustrate the concepts
// of creating 1D array of pointers
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    // Dynamically creating the array
    // of size = 5
    int* p = new int[5];
 
    // Initialize the array p[] as
    // {10, 20, 30, 40, 50}
    for (int i = 0; i < 5; i++) {
        p[i] = 10 * (i + 1);
    }
 
    // Print the values using pointers
    cout << *p << endl;
    cout << *p + 1 << endl;
    cout << *(p + 1) << endl;
    cout << 2 [p] << endl;
    cout << p[2] << endl;
    *p++;
 
    // Pointing to next location
    cout << *p;
 
    return 0;
}

Output

10
11
20
30
30
20

Динамическое 2D массив указателей в C ++

A динамический массив указателей в основном массив указателей, где каждый индекс массива указывает на блок памяти. В нашем сознании это представляет собой двухмерный вид. Но логически это непрерывный блок памяти.

Синтаксис:

<dataType> **<Pointer name> = new <dataType> *[<size>];

Пример:

int **P = new int *[4];

Примечание. Символ * (звездочка) определяет уровень указателя, один * означает один уровень указателей, где ** означает два уровня указателей и так далее. Кроме того, уровень указателя должен быть таким же, как у размерного массива, который вы хотите создать динамически.

Подход:

Создайте одномерныймассив указателей.

Создайте одномерныймассив указателей

Теперь создайте столбец как массив указателей для каждой строки следующим образом:

P [0] = новый int [3];
P [1] = новый int [3];
P [2] = новый int [3];
P [3] = новый int [3];

Одномерный массив указателей указывает на блок памяти (указан размер). По сути, P [0],…, P [3]указывают на одномерный массив целых чисел.

Одномерный массив указателей указывает на блок памяти (указан размер)

Доступ к элементам массива

* Pравно P [0], который является адресом 1-й строки, 1-й столбец — & P [0] [0] = 3000.

* (P + 1)равно ’ P ’ равно 1000 + 1 (sizeof int) = 1004, а * означает разыменование. Таким образом, печатается значение, хранящееся по адресу, т.е. * 1004 =

* (P + 1) + 2аналогично предыдущему случаю, но +2 означает, что (& P [1] + 2) равно & P [1] [2] = 4008.

* (* (P + 1) + 2)- то же самое, что и в предыдущем случае, но первая звездочка «* (….)» Означает разыменование этого адреса. Следовательно, результат равен значению в & P [1] [2] =

* (4008) = 67.

Ниже приведена программа на C ++, чтобы проиллюстрировать вышеупомянутые концепции:

// C++ program to illustrate the concepts
// of creating 2-D array of pointers
#include <iostream>
using namespace std;
 
// Driver Code
int main()
{
    int N = 3;
 
    // Creating the array of pointers
    // of size N
    int** p = new int*[N];
    int x = 1;
 
    // For multiplying
    for (int i = 0; i < N; i++) {
 
        p[i] = new int[N];
 
        // Creating N sized int memory
        // block
        for (int j = 0; j < N; j++, x++) {
 
            p[i][j] = 10 * x;
 
            // The above statement can
            // also be written as:
            // *(*(p+i)+j) = 10 * x
        }
    }
 
    // Print the values using pointers
    cout << *p << endl;
    cout << **p << endl;
    cout << *p + 1 << endl;
    cout << **p + 1 << endl;
    cout << *(*(p + 1) + 0) << endl;
    cout << p[2][2] << endl;
 
    return 0;
}

Output

0x158de90
10
0x158de94
11
40
90

Читайте также:  Seaborn Pairplot
Оцените статью
bestprogrammer.ru
Добавить комментарий