日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

詳解C++?指針與二維數組名_C 語言

作者:木三百川 ? 更新時間: 2022-11-04 編程語言

和一維數組類似,C++ 將二維數組名解釋為其第一個元素的地址,而二維數組的第一個元素為一維數組,下面詳細總結下二維數組名的性質。

和一維數組類似,C++ 將二維數組名解釋為其第一個元素的地址,而二維數組的第一個元素為一維數組,以下面的程序為例,二維數組名 array2d&array2d[0] 等效,它們的類型都為 short (*)[5];對數組名應用地址運算符時,得到的是整個數組的地址,它的類型為 short (*)[5][5],假設 short 寬 2 字節,系統為 32 位,數組首地址為0x00BCF8FC,例子中幾種表示的區別為:

  • 數組名?array2d?和?&array2d[0]?等效,類型都為?short (*)[5],存儲的是一個 10 字節內存塊的地址,它們指向的對象是包含 5 個元素的?short?數組,但在運用?sizeof()?時,這兩者會有區別,sizeof(array2d)=50?而?sizeof(&array2d[0])=4。
  • 表示?&array2d?的類型為?short (*)[5][5],存儲的是一個 50 字節內存塊的地址,它指向的對象是 5 行 5 列的二維?short?數組。
  • 表示?&array2d[0][0]?和?array2d[0]?等效,類型都為?short *,存儲的是一個 2 字節內存塊的地址,它指向的對象是?short?類型數據,但在運用?sizeof()?時,這兩者會有區別,sizeof(&array2d[0][0])=4?而?sizeof(array2d[0])=10。
  • 類型?short **,存儲的是一個 4 字節內存塊的地址,它指向的對象是?short*?類型數據。
//聲明并初始化數組
short array2d[5][5] = {{5,2,8,4,1},
                       {2,2,4,6,8},
                       {1,5,8,9,4},
                       {5,7,6,2,5},
                       {7,6,5,8,1}};
 
//聲明并初始化指針一:以下幾種賦值結果對ptra等效
short (*ptra)[5] = array2d;     //方式一:值為0x00BCF8FC
short (*ptra)[5] = &array2d[0]; //方式二:值為0x00BCF8FC
 
//聲明并初始化指針二
short (*ptrb)[5][5] = &array2d; //值為0x00BCF8FC
 
//聲明并初始化指針三:以下幾種賦值結果對ptrc等效
short *ptrc = &array2d[0][0];   //方式一:值為0x00BCF8FC
short *ptrc = array2d[0];       //方式二:值為0x00BCF8FC
 
//聲明并初始化指針四:以下幾種賦值結果對ptrd等效
short *ptrTmp[5] = {array2d[0],array2d[1],array2d[2],array2d[3],array2d[4]};
short** ptrd = ptrTmp;          //方式一:值為0x00BCF8A4
short** ptrd = new short*[5]{
    array2d[0],
    array2d[1],
    array2d[2],
    array2d[3],
    array2d[4]};                //方式二:值為0x01156470,需配合使用delete[]釋放內存
short** ptrd = new short*[5]();
ptrd[0] = array2d[0];
ptrd[1] = array2d[1];
ptrd[2] = array2d[2];
ptrd[3] = array2d[3];
ptrd[4] = array2d[4];           //方式三:值為0x01046AE0,需配合使用delete[]釋放內存
 
//訪問數組第3行第4列的元素
cout << array2d[2][3];    //結果為9
cout << *(array2d[2]+3);  //結果為9
cout << *(*(array2d+2)+3);//結果為9
 
cout << ptra[2][3];     //結果為9
cout << *(ptra[2]+3);   //結果為9
cout << *(*(ptra+2)+3); //結果為9
 
cout << (*ptrb)[2][3];  //結果為9
cout << *((*ptrb)[2]+3);//結果為9
cout << *(*(*ptrb+2)+3);//結果為9
 
cout << ptrc[2*5+3];    //結果為9
cout << *(ptrc+2*5+3);  //結果為9
 
cout << ptrd[2][3];     //結果為9
cout << *(ptrd[2]+3);   //結果為9
cout << *(*(ptrd+2)+3); //結果為9
 
//應用指針算術時單位1表示的字節數
cout << int(array2d+1)-int(array2d);              //結果為10
cout << int(&array2d[0]+1)-int(&array2d[0]);      //結果為10
cout << int(&array2d+1)-int(&array2d);            //結果為50
cout << int(&array2d[0][0]+1)-int(&array2d[0][0]);//結果為2
cout << int(array2d[0]+1)-int(array2d[0]);        //結果為2
 
cout << int(ptra+1)-int(ptra);      //結果為10
cout << int(ptrb+1)-int(ptrb);      //結果為50
cout << int(ptrc+1)-int(ptrc);      //結果為2
cout << int(ptrd+1)-int(ptrd);      //結果為4
 
//應用sizeof()獲得內存量大小
cout << sizeof(array2d);       //結果為50
cout << sizeof(&array2d[0]);   //結果為4
cout << sizeof(&array2d);      //結果為4
cout << sizeof(&array2d[0][0]);//結果為4
cout << sizeof(array2d[0]);    //結果為10
cout << sizeof(array2d[0][0]); //結果為2
 
cout << sizeof(ptra);   //結果為4
cout << sizeof(ptrb);   //結果為4
cout << sizeof(ptrc);   //結果為4
cout << sizeof(ptrd);   //結果為4

版權聲明:本文系博主原創文章,著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請附上出處鏈接。遵循 署名-非商業性使用-相同方式共享 4.0 國際版 (CC BY-NC-SA 4.0) 版權協議。

補充介紹:C++二維數組名與數組指針的思考

二維數組名和數組指針可以當做一個東西用,但兩者之間的含義是不同的。
二維數組名是一個指向數組中所有元素的指針,而數組指針是一個行指針。體現在sizeof()上的不同。

#include <iostream>
using namespace std;
int main()
{
    // a是一個二維數組名,指向一個二維數組
    int a[2][3] = {{1,2,3},{4,5,6}};
    // a所占的內存為24,即6*4
    cout<<sizeof(a)<<endl;
    // 輸出為4
    // a:&a[0]   a+1:&a[1]  *(a+1) : a[1] = &a[1][0]
    // **(a+1) = a[1][0]
    cout<<**(a+1)<<endl;
    // 輸出為3
    // a:&a[0]  *a:a[0]:&a[0][0]  *a+2:&a[0][2]
    // *(*a+2):a[0][2]
    cout<<*(*a+2)<<endl;

    // 數組指針
    int (*b)[3] = a;
    // 數組指針可以當做二維數組名用
    cout<<**(b+1)<<endl;
    cout<<*(*b+2)<<endl;

    cout<<sizeof(b)<<endl;
}

原文鏈接:https://www.cnblogs.com/young520/p/16687946.html

欄目分類
最近更新