當前位置:首頁 » 密碼管理 » 二維數組的指針訪問

二維數組的指針訪問

發布時間: 2023-07-17 23:30:24

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

之前對數組的概念一直沒有理解透徹,只覺得數組名就是個常量指針而已,用法和基本的指針差不多。所以當我嘗試用二級指針去訪問二維數組時,就經常會出錯。下面就是剛開始寫的一個錯誤的程序: #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;}由於二級指針要跳兩次,所以中間還需要額外的存儲一級指針的空間。所以一般不建議用二級指針去訪問二維數組。

❷ 二維數組如何用指針表示

二維數組用指針表示有兩種方式:

一、動態數組方式。

完全由動態數據構成二維數組。如M行N列的數組,先分配M個一維指針空間,然後在每個一維指針上分配N個元素的空間,即成為動態二維數組。

和普通數組不同,這種動態二維數組的各行之間地址並不連續。

參考代碼:

#include<stdlib.h>
int**create(intm,intn)//創建m行n列的二維數組。
{
int**r;
inti;
r=(int**)malloc(sizeof(int*)*m);//分配m個int*指針內存。
for(i=0;i<m;i++)//遍歷每行
r[i]=(int*)malloc(sizeof(int)*n);//每行分配n個int型元素。
returnr;//返回地址值。
}

二、通過數組指針指向已有二維數組。

對於已經定義好的M行N列數組,可以使用指向N個元素的數組指針,指向該數組並訪問。

參考代碼:

inta[10][5];
int(*p)[5];//每行5個元素的數組指針。
p=a;//把p指向a。

❸ C語言如何定義指針指向字元型二維數組

使用指針變數訪問二維數組的任意一個元素的方法:

1.使用列指針:定義一個列指針p,讓它指向二維數組的第0個元素

int a[3][4];

int *p;

p=&a[0][0];

//因為a[0]是第0行的數組名,所以p=&a[0][0]相當於p=a[0],因為a[i][j]前面共有i*4+j個元素

該二維數組的任意i行j列元素可表示為*(p+i*4+j)。

2.使用行指針:定義一個行指針p,讓它指向二維數組的第0行

int a[3][4];

int (*p)[4];

p=a; //也可以為p=&a[0];

其中* ( *(p+i)+j)表示任意一個i行j列的元素。

(3)二維數組的指針訪問擴展閱讀:

數組的使用規則:

1.可以只給部分元素賦初值。當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:static int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而後5個元素自動賦0值。

2.只能給元素逐個賦值,不能給數組整體賦值。例如給十個元素全部賦1值,只能寫為:static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:static int a[10]=1;請注意:在C、C#語言中是這樣,但並非在所有涉及數組的地方都這樣,資料庫是從1開始。

3.如不給可初始化的數組賦初值,則全部元素均為0值。

4.如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。例如:static int a[5]={1,2,3,4,5};可寫為:static int a[]={1,2,3,4,5};動態賦值可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合scanf函數逐個對數組元素賦值。

網路-數組

❹ 怎樣通過指針變數訪問二維數組的下標變數

可以用指向數組的指針來訪問二維數組的下標變數。下面就是事常式序:

intmain()
{
intiArray[2][3]={{1,2,3},{4,5,6}};
int(*pArray)[3]=NULL;
pArray=iArray;

printf("array[0][0]=%d ",pArray[0][0]);
printf("array[1][2]=%d ",pArray[1][2]);

return0;
}
熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:235
java駝峰 發布:2025-02-02 09:13:26 瀏覽:651
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726