文章目錄
- 一、堆區開辟數組
- 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