20.【C/C++ 指针数组和数组指针 (超详版)】
指針數組和數組指針(指針重點)
- (一)、指針數組
- 1. 什么是指針數組:
- 2.指針數組的格式:
- 3.指針數組的作用:
- 4.指針數組與一維數組的關系:
- 補充:::::::::::::::::::
- 5.指針數組與二維數組的關系
- 6.指針數組申請動態二維數組
- 指針數組申請動態二維數組格式:
- 6.實戰項目:
- 代碼展示:
- 效果展示:
- 7.小結
- 7.1指針數組名加1,移動多少字節?
- 7.2指針數組名相當于什么樣的指針?
- (二)、數組指針:
- 1.什么是數組指針
- 2.數組指針的格式:
- 3.數組指針的作用:
- 4.數組指針與二維數組的關系:
- 補充:::::::::::::::::::
- 多數組有關概念
- 4.實戰項目:
- 代碼展示:
- 效果展示:
- (三)、數組指針和指針數組
(一)、指針數組
1. 什么是指針數組:
在C語言和C++等語言中,數組元素全為指針變量的數組稱為指針數組,指針數組中的元素都必須具有相同的存儲類型、指向相同數據類型的指針變量。指針數組是數組元素為指針的數組(例如 int *p[3],定義了p[0],p[1],p[2]三個指針),其本質為數組。
2.指針數組的格式:
數據類型 *首地址[];3.指針數組的作用:
指針數組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活。
4.指針數組與一維數組的關系:
指針數組每個元素都是指針,一維數組的地址可以賦值給指針。然后進行操作.
#include<iostream> using namespace std; int main() {int* p[3]; //定義一個指針數組int a[] = { 3,6,1,9,10 }; //定義一個整型數組p[0] = a; //p[0]是一個類型為int* 指向int的指針,a是一個int*,指向int p[1] = a + 1;p[2] = a + 3;cout << (*p[0]) << " " << (*p[1]) << " " << (*p[2]) << endl; //[]優先級比()高,所以()沒起到作用cout << a[0] << " " << a[1] << " " << a[3] << endl;int* q; //普通指針q = a + 1;cout << *q; }補充:::::::::::::::::::
如果是 二維數組a[0]+1;代表a[0][1]; 這時候a[0]是行數組名它代表這一行的首地址就是a[0][0],+1就等于加它類型的字節數1x字節數,(+2就是2x字數)結果就是a[0][1];如果是一維的話,更簡單;+1就等于加它類型的字節數x1;結果是a[1];
5.指針數組與二維數組的關系
#include<iostream> using namespace std; int main() {int* p[3]; //定義一個指針數組int a[2][3] = {{3,6,1} ,{12,9,10}}; //定義一個二維整型數組p[0] = a[0]; //a[0]=&a[0][0]p[1] = a[1]; // a[1]=&a[1][0]cout << a[0][1] << endl; //輸出a[0][1]cout << *(a[0] + 1) << endl; //輸出a[0][1],(a[0]+1)這樣代表地址cout << *(p[0] + 1) << endl; //輸出a[0][1],指針+1代表移動一個數(列)cout << *(p[0] + 2) << endl; //輸出a[0][2],指針+1代表移動一個數(列)return 0; }接下來讓我們練習一道題:(二維數組全部元素求和)
#include<iostream> using namespace std; int main() {int sum=0;int* p[3]; //定義一個指針數組int a[2][3] = {{3,6,1} ,{12,9,10}}; //定義一個二維整型數組p[0] = a[0]; //a[0]=&a[0][0]p[1] = a[1]; // a[1]=&a[1][0]for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){sum += *(p[i] + j);//或者 *(*(p+i)+j) 或者 p[i][j]}}cout << "求和后得:" << sum << endl;return 0; }6.指針數組申請動態二維數組
指針數組申請動態二維數組格式:
【方法1基本格式】 int **p; //指針類型是int** 型,指向int*型的指針變量 p=new int*[列] for(int i=0;i<列;i++) {p[i]=new int [列] }6.實戰項目:
代碼展示:
1.錯誤示范:
【指針指向二維數組不能用*p=a[0]】 #include <iostream> #include <iomanip> using namespace std; int main() {int a[2][2] = {1,2,3,4};int* p;*p = a[0];for (int i = 0; i < 4; i++){cout << setw(2) << *(p+i) ;}return 0; }2.指針數組申請動態二維數組
#include <iostream> using namespace std; int main() {int m, n;cout << "請輸入行數為:" << endl;cin >> m;cout << "請輸入列數:" << endl;cin >> n;int**p; // p = new int*[n];for (int i = 0; i < n; i++){p[i] = new int[n]; //左邊行,右邊列}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> p[i][j];}}cout << "輸出為:" << endl;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cout<< p[i][j]<<" ";}}delete[]p;return 0; }效果展示:
1.錯誤示范效果展示:
2.申請動態二維數組正確效果
7.小結
7.1指針數組名加1,移動多少字節?
*(p+1):走了一行; * (p+1)+1走了一列
7.2指針數組名相當于什么樣的指針?
指針數組名就是元素地址相當于一級指針取地址就是二級指針,故指針數組名相當于二級指針“數據類型 * p” 本身就是一個指針,而它的數據類型是int * 也是一個指針,故稱為二級指針。
(二)、數組指針:
1.什么是數組指針
數組指針,指的是數組名的指針,即數組首元素地址的指針。即是指向數組的指針。例:int (*p)[10]; p即為指向數組的指針,又稱數組指針。
2.數組指針的格式:
數據類型(*p)[];3.數組指針的作用:
數組指針是指向數組地址的指針,其本質為指針;
4.數組指針與二維數組的關系:
#include<iostream> using namespace std; int main() {int(* p)[3]; //定義一個數組指針int a[2][3] = {{3,6,1} ,{12,9,10}}; //定義一個二維整型數組return 0; }這里a是個二維數組的數組名,相當于一個二級指針常量;//二維數組名與二級指針毫無關系(初學者常常混淆)。
p是一個指針變量,它指向包含5個int元素的一維數組,此時p的增量以它所指向的一維數組長度為單位;
補充:::::::::::::::::::
p+i是一維數組a[i]的地址,即p+i==&a[i];對該式兩邊作取內容運算()得(p+i)a[i],由于二維數組中a[i]&a[i][0], 則 * (p+i)表示a[i][0]的地址,即 * (p+i)==&a[i][0](p+2)+3表示a[2][3]地址(第一行為0行,第一列為0列),(*(p+2)+3)表示a[2][3]的值。
多數組有關概念
注意a[0],a[1],a[2]表示的都是對應那行的數組首地址,和數組名,而不是一個元素,(這里得到*號不是指針,而是取地址)!!!!!!!!!!!
多維數組地址的表示方法
設數組a的首地址為1000,各下標變量的首地址及其值。C語言允許把一個二維數組分解為多個一維數組來處理。因此數組a可分解為三個一維數組,即a[0],a[1],a[2]。 每一個一維數組又含有四個元素。例如a[0]數組,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。數組及數組元素的地址表示如下: a是二維數組名,也是二維數組0行的首地址,等于1000。a[0]是第一個一維數組的數組名和首地址,因此也為1000。(a+0)或a是與a[0]等效的,它表示一維數組a[0]0號元素的首地址。也為1000。&a[0][0]是二維數組a的0行0列元素首地址,同樣是1000。因此,a,a[0] ,*(a+0), * a,&a[0][0]是相等的。同理,a+1是二維數組1行的首地址,等于1004。a[1]是第二個一維數組的數組名和首地址,因此也為1004。&a[1][0]是二維數組a的1行0列元素地址,也是1004。因此a+1,a[1],* (a+1),&a[1][0]是等同的。由此可得出:a+i,a[i], * (a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。因為在二維數組中不能把&a[i]理解為元素a[i]的地址,不存在元素a[i]。
C語言規定,它是一種地址計算方法,表示數組a第i行首地址。由此,我們得出:a[i],&a[i], * (a+i)和a+i也都是等同的。另外,a[0]也可以看成是a[0]+0是一維數組a[0]的0號元素的首地址,而a[0]+1則是a[0]的1號元素首地址,由此可得出a[i]+j則是一維數組a[i]的j號元素首地址,它等于&a[i][j]。
4.實戰項目:
代碼展示:
1.數組指針和二維數組的聯用
#include<iostream> using namespace std; int main() {int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int(*p)[4]; p = (int(*)[4])a; //目的是為了把a看作參數for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++) printf("%d ", p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)printf("\n");} }2.數組指針創建動態二維數組
#include <iostream> using namespace std; int main() {int m, n;cout << "請輸入行數為:" << endl;cin >> m;int(*p)[3]; p = new int[m][3]; //列數是實參,否則報錯哦for (int i = 0; i < m; i++){for (int j = 0; j < 3; j++){cout << "請輸入p[" << i << "][" << j << "]的值" << endl;cin >> p[i][j];}}cout << "輸出為:" << endl;for (int i = 0; i < 5; i++){for (int j = 0; j < 3; j++){cout<< p[i][j]<<" ";}}return 0; }效果展示:
1.數組指針和二維數組聯用
2.數組指針和動態二維數組
(三)、數組指針和指針數組
祝君更上一層樓!!!!!!
總結
以上是生活随笔為你收集整理的20.【C/C++ 指针数组和数组指针 (超详版)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 朱志辉_《DB2设计、管理
- 下一篇: SaaS产品你知道哪些?盘点几款在线编辑