文章目录
- 一、堆区开辟数组
- 1. 数组指针与指针数组的区别
- 2. 1维数组
- 3. 2维数组
- 二、二级指针
一、堆区开辟数组
1. 数组指针与指针数组的区别
数组指针是指指向数组的指针,它的本体是一个指针, 声明指针变量的时候一般用括号,因为括号的优先级高于[],这样在编译的时候就知道这是声明一个数组的指针。
int (*p)[5];
指针数组是指数组由指针组成的数组,下面表示由5个指针变量组成了一个名为p的一维数组。
int *p[5];
2. 1维数组
1维数组的声明方式很多,可以概括为4种方式
1:类名* 指针 = new 类名[Size];
2:类名* 指针 = new 类名[Size] ();
3:类名* 指针 = new 类名[2]{ N1,N2};
4:类名* 指针 = new 类名[2]{ N };
#include<iostream>
using namespace std;int main()
{int* const p = new int[100];//在堆中开辟100个内存空间cout << p << endl;for (int i = 0; i < 100; i++){p[i] = i + 1;//每次循环数组的值加1,p[]表示值,不是指针}//调用一维数组for (int i = 0; i < 100; i++) {cout << p[i] << endl;}//用完记得删除delete[]p;return 0;
}
3. 2维数组
方法一:
#include<iostream>
using namespace std;int main()
{//二维数组的格式为类名+(指针变量)[列数]。 int(*p)[3] = new int[3][3]{ {1,2,3},{4,5,6},{7,8,9} };int i, j;//输入行列值cout << "输入行号:"; cin >> i;cout << "输入列号:";cin >> j;//p表示指针首元素的地址,所以*(p+i-1)表示指针地址加了4*(i-1)*3,(*p+j-1)表示指针地址加了4*(j-1)cout << p << endl;cout << p[0] << endl;//1行1列元素的地址cout << (*(p + 1 - 1)) << endl;//1行1列元素的地址cout << (*(p + 1 - 1)+1) << endl;//1行2列元素的地址cout << (*(p + 2 - 1)) << endl;//二行一列元素的地址cout << *(*(p + i - 1) +j- 1) << endl;cout << p[i-1][j-1] << endl;//直接访问
}
输入行号:1
输入列号:1
0109E048
0109E048
0109E048
0109E04C
0109E054
1
1
方法二:
#include<iostream>
using namespace std;int main()
{int row;cin >> row;int col;cin >> col;int** arr = new int* [row];//二级指针指向row行数组指针的地址for (int i = 0; i < row; ++i){arr[i] = new int[col]();//为每一行分配地址,内存空间的长度为col*4}for (int i = 0; i < row; ++i){for (int j = 0; j < col; ++j)//为数组填充元素{arr[i][j]++;cout << arr[i][j]<<endl;}}//释放空间for (int i = 0; i < row; ++i){delete[col]arr[i];//先释放二维数组中每个元素指向的数组arr[i] = NULL;}delete[row]arr;//在释放该指针数组}
3
3
1
1
1
1
1
1
1
1
1
二、二级指针
int a = 10; int* p = &a;int** p1 = &p;//a的指针的指针cout << p << endl;cout << *p1 << endl;cout << p1 << endl;cout << **p1 << endl;
0097FB0C
0097FB0C
0097FB00
10