Массив указателей представляет собой массив переменных — указателей. Это также известно как массивы указателей. Мы обсудим, как создать 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(= 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