在 C++ 中创建指针数组
指针数组是指针变量数组。它也被称为指针数组。我们将讨论如何动态创建一维和二维指针数组。动态一词表示内存是在运行时分配的,它在 Heap Section 中分配内存。在堆栈中,内存是有限的,但取决于使用的语言/操作系统,平均大小为1MB 。
C++ 中的动态一维数组:指针数组是一种由指针类型的变量组成的数组。这意味着这些变量可以指向其他一些数组元素。
例子:
int *p[3];
// Now P[0], P[1], P[2] can point to int memory blocks.
在大小为 N的动态分配数组中,块在堆中创建并返回第一个内存块的地址。通过使用该地址,可以访问每个元素。 C++中的动态数组大家应该熟悉new关键字或者malloc(),calloc()都可以使用。
句法:
例子:
int *p = new int [5];
访问动态数组的元素:
- 1. 创建大小为 N (= 5) 的一维数组,并将基地址分配给变量P 。如果编写以下语句,则输出为1000 。
cout << p;
- 如果需要第 1000个地址中的值,则使用 *(星号)符号取消引用它,如下所示:
cout << *P;
// It is the same as P[0]. The output is 23.
基本指针运算:以下是有关指针运算的一些要点:
- *(P + 1):
P = 1000 and 1 = sizeof(int) = 4 bytes.
Hence, *(1004) and dereferencing by * (asterisk) symbol. Now, the final result is 38.
- *(P) + 1:
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.
下面是用于说明上述概念的 C++ 程序:
C++
// C++ program to illustrate the concepts
// of creating 1D array of pointers
#include
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;
}
C++
// C++ program to illustrate the concepts
// of creating 2-D array of pointers
#include
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;
}
10
11
20
30
30
20
C++ 中的动态二维指针数组:动态指针数组基本上是一个指针数组,其中每个数组索引都指向一个内存块。这代表了我们脑海中的二维视图。但从逻辑上讲,它是一个连续的内存块。
句法:
例子:
int **P = new int *[4];
注意: *(星号)符号定义了指针的级别,一个*表示一级指针,其中**表示两级指针,以此类推。此外,指针的级别必须与您要动态创建的维数组相同。
方法:
- 创建一个一维指针数组。
- 现在,将列创建为每行的指针数组,如下所示:
- P[0] = 新整数 [3];
- P[1] = 新整数 [3];
- P[2] = 新整数 [3];
- P[3] = 新整数 [3];
- 一维指针数组指向一个内存块(提到了大小)。基本上, P[0], ..., P[3]指向一维整数数组。
访问数组元素:
- *P等于P[0]这是第一行第一列的地址是&P[0][0] = 3000 。
- *(P + 1)等于 ' P ' is 1000 + 1(sizeof int) = 1004并且*表示取消引用。所以存储在地址处的值被打印出来,即*1004 = 4000。
- *(P + 1) + 2与上述情况相同,但+2表示(&P[1] + 2)等于&P[1] [2] = 4008 。
- *(*(P + 1) + 2)与上述情况相同,但第一个星号'*(....)'表示取消引用该地址。因此,结果等于&P[1][2] = *(4008) = 54 中的值。
下面是用于说明上述概念的 C++ 程序:
C++
// C++ program to illustrate the concepts
// of creating 2-D array of pointers
#include
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;
}
0x158de90
10
0x158de94
11
40
90