導航:首頁 > 軟體知識 > 怎麼用指針調用二維數完整程序

怎麼用指針調用二維數完整程序

發布時間:2022-12-30 09:55:54

❶ 實例分析用指針訪問二維數組的幾種方法

之前對數組的概念一直沒有理解透徹,只覺得數組名就是個常量指針而已,用法和基本的指針差不多。所以當我嘗試用二級指針去訪問二維數組時,就經常會出錯。下面就是剛開始寫的一個錯誤的程序: #include <stdio.h intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int**pArray = NULL; pArray = iArray;printf("array[0][0] = %d\n" , pArray[0][0]);printf("array[1][2] = %d\n" , pArray[1][2]);return0;}開始的時候我是這樣分析的:本來數組和指針就差不多,一維數組和一維指針對應,那麼二維數組名應該和二維指針差不多,所以上面那個程序是沒有錯的,應該列印出的是1和6。但是當我實際編譯運行的時候,卻出現了段錯誤,也就是我訪問了不該訪問的地址空間。那錯誤到底出在什麼地方呢?正確的程序應該怎麼寫呢? 為了解決問題,不得不讓我重新理解數組的含義。仔細翻閱一些書籍後,我發現其實數組並不是我原來想像的那麼簡單:一個常量指針標識的一群變數的集合。數組應該也算是一個完備的變數類型:有名字,有大小,也有地址。只不多就是名字和它的地址一樣罷了。也正是因為數組有大小,所以當用sizeof對數組名進行運算時,算出來的是實際數組的大小,而不是指針的大小。 也正是因為這樣,所以指向數組的指針和指向指針的指針也大不一樣。它們倆最明顯的不同就是表現在指針步進的時候。我們知道指針在進行++運算的時候,跨越的實際地址取決於指針指向的數據類型:對於一般的32位機來說,假如指向的是int型數據,跨越的實際地址就是4,指向的是指針型數據,跨越的實際地址也是4,當指向的是數組類型的時候,跨越的實際地址就是數組的長度了。 現在再回頭分析上面那個錯誤程序,根據下標引用符號[]的運算規則,我們知道pArray[0][0]其實就是**pArray,而iArray實際上只是個數組變數名,而它的值就是整個數組的開始地址(其實&iArray,iArray,iArray[0]以及&iArray的值都是數組的開始地址,都是在編譯過程中編譯器賦予的值)。那麼其實*pArray就已經是iArray[0][0]的值了,也就是1,而**pArray則是去訪問地址為1的地址空間中的數據,自然會出段錯誤。 其實用指針訪問二維數組可以直接用一級指針就可以了。比如下面這個程序:intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int*pArray = NULL; pArray = iArray;printf("array[0][0] = %d\n" , *pArray);printf("array[1][2] = %d\n" , *(pArray +1*3+2));return0;}因為數組本身在地址空間中就是連續排列的,根據行數和列數,我們自己計算出訪問單元的地址偏移量就可以用一級指針輕松遍歷二維數組中的所有數據了。 我們還可以嘗試用指向數組的指針來訪問二維數組的成員。下面就是事常式序:intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int(*pArray)[3] = NULL;pArray = iArray;printf("array[0][0] = %d\n" , pArray[0][0]);printf("array[1][2] = %d\n" , pArray[1][2]);return0;}簡單分析一下這個程序:我們知道[]運算符的結合方向是由左向右,pArray[1][2]就等價於(* (pArray + 1))[2],而由於pArray是數組指針,而且數組的長度為3,所以* (pArray + 1)就表示iArray[1]這個數組,則pArray[1][2]則就完全等價於iArray[1][2]。 如果非得想用二級指針來訪問二維數組的話,我們還得借用指針數組(數組內存儲的都是指針類型的數據),下面是事常式序:intmain(){intiArray[2][3] = {{1,2,3 },{4,5,6}};int*ipArray[2] = {iArray[0 ], iArray[1]};int**pArray = NULL; pArray = ipArray;printf("array[0][0] = %d\n" , pArray[1][2]);return0;}由於二級指針要跳兩次,所以中間還需要額外的存儲一級指針的空間。所以一般不建議用二級指針去訪問二維數組。

❷ 用指向數組元素的指針訪問二維數組

int(*p)[10]定義了一個指向二維數組的指針p,賦給它10個長度。然後把a數組的值賦給(*p)[10],注意,這里是a數組是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,將a[1][0...9]放入(*p)[1]。最後(*p)[10]中的值只有五行被初始化為a數組的值了。
在本例中,p和p[0]是同一個意思,就是數組a的起始地址,等價於cout<<a<<endl,但是他們有區別,p指向的是整個數組的首地址,而p[0]則指向a的首行首地址(繼續往下看...)。
p[9]則值內存為p數組分配的(*p)[9]的地址。如果你仔細驗證程序的輸出結果,你就會發現:
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
{
int a[5][10]={1,2};
int (*p)[10]=a;
cout<<p<<endl;
cout<<p[0]<<endl;
cout<<p[9]<<endl;
}
輸出結果為(不同機器結果不同):
0012FEB8
0012FEB8
00130020
如果你驗證它們這些地址存儲的值,你會發現:
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
{
int a[5][10]={1,2};
int (*p)[10]=a;
cout<<*p<<endl;
cout<<(*p)[0]<<endl;
cout<<(*p)[9]<<endl;
}
輸出結果為:
0012FEB8
1
0
這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加一個*操作符,如下:
cout<<**p<<endl;
這時輸出結果自然就會和(*p)[0]一樣是1了。

閱讀全文

與怎麼用指針調用二維數完整程序相關的資料

熱點內容
三板市場生意怎麼樣 瀏覽:384
猶太人的技術是哪裡來的 瀏覽:821
如何和外資交易 瀏覽:291
vivo手機如何導入舊手機的數據 瀏覽:65
手機開機程序如何升級 瀏覽:883
父子二手車過戶交易發票怎麼開 瀏覽:251
南昌傢具批發市場什麼時候開門 瀏覽:52
如何選取數據中的和為一定數 瀏覽:757
在交易貓買號被賣家找回怎麼辦 瀏覽:235
張傑技術到底怎麼樣 瀏覽:295
高端凈水器怎麼代理 瀏覽:514
怎麼找代理商資料 瀏覽:761
襄陽中考志願填了多久才能有錄取信息 瀏覽:430
國產紅酒如何代理 瀏覽:452
超市賣農產品需要什麼資料 瀏覽:673
程序員需要什麼稱號 瀏覽:900
爆款產品是怎麼出貨的 瀏覽:235
銀行放貸需要什麼程序 瀏覽:960
蘇州珍島技術有限公司怎麼樣 瀏覽:540
全程陪同領導信息怎麼發 瀏覽:817