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

二維指針訪問二維數組

發布時間: 2022-06-13 15:05:28

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

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

『貳』 C++ 二維指針指向二維數組

不能用二維指針指向二維數組,指向二維數組的指針最後一維必須是確定的。
int a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int (*s)[4]; //表明s指向一個n*4的數組
s=a;

還有一種方法是將二維數組看成是一維數組(因為數組在內存中連續存儲)
int a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int *s;
s=&a[0][0];
這樣可以用s[x*y]來表示a[x][y];

『叄』 c語言如何利用指針接受二維數組實參

1、通過二級指針去訪問二維數組需要先給二級指針分配等同於二維數組行數的一維數組指針,然後把二維數組的每行首地址賦值給對應位置的一維指針上。之後就可以通過二維指針直接訪問了。
2、常式:

#include<stdio.h>//輸入輸出頭文件。
#include<stdlib.h>//本程序需要用到malloc/free函數,引用該頭文件。
intmain()
{
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//定義二維數組a,並賦值從1-12.
int**p=NULL;//定義二維指針。
inti,j;

p=(int**)malloc(sizeof(int*)*3);//要訪問的數組有三行,所以申請三個一維指針變數。
for(i=0;i<3;i++)
{
p[i]=a[i];//將二維數組行地址賦值到對應的一維指針上。
}

for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d",p[i][j]);//用指針輸出元素。p[i][j]這里也可以寫作*(*(p+i)+j)。
printf(" ");//每行輸出後加一個換行
}

free(p);//釋放申請的內存。

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了。

『伍』 c++如何用指針指向二維數組

不能用二維指針指向二維數組,指向二維數組的指針最後一維必須是確定的。
int
a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int
(*s)[4];
//表明s指向一個n*4的數組
s=a;
還有一種方法是將二維數組看成是一維數組(因為數組在內存中連續存儲)
int
a[4][4]={1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7};
int
*s;
s=&a[0][0];
這樣可以用s[x*y]來表示a[x][y];

『陸』 二維指針 指向 二維數組 如何理解

press = (short **)array1;引起的。press是short **型,array1是short (*)[8]型,互不匹配。用press = (short **)array1;強制轉換了一下,只是臨時把array1轉為short **型賦給press,array1仍然是原來的類型short (*)[8]不變。顯然short **型的指針press不具備操作short (*)[8]型數組的能力。

『柒』 c語言中如何通過二級指針來操作二維數組

1、首先我們打開電腦里的C語言軟體,新建一個工程和.c文件,輸入頭文件和主函數。

『捌』 怎麼讓一個二維指針指向一個二維數組

樓主,我想講講二級指針的原理,它是指向內存地址的地址,簡單說就是取兩次地址,一維數組,二維數組它們的元素都對應擁有一個暫時分配的內存地址,就是說只需要一個一級指針就可以完成取址,如果你用一個二級指針去取址是會取到亂值,如果是系統的地址系統就會崩潰(我就是試過用指針把編譯器搞崩潰了),我下面例子說明一下:
一級指針取址:
char a[10];
char *p;
p=a/*將a[10]首地址賦值給一級指針*/
scanf("%s",p)/*編譯系統會移動自動指針*/

char a[10][10];
char *p;
p=a[0]/*將a[10][10]首地址賦值給一級指針*/
scanf("%s",p)/*編譯系統會移動自動指針*/
二級指針:
char *a[]={"12","34","56"};/*定義一個指針數組*/
char **p;/*二級指針*/
p=a;
printf("%s",*p);/*輸出12*/
這里我解釋一下,定義一個指針數組,就是數組裡面又有地址,你仔細看看,數組有地址,指針數組裡面的字元串如("12")也是有地址的,這樣就需要用一個二級指針指向它了,就是二級定址,這是*p就不再是元素,就變成字元串"12"的首地址,由於系統自動移動指針,所以就輸出12
呵呵,如果你明白,那麼三級指針也是同樣道理,定義一個指向指針的指針數組,用一個
三級指針實現三級定址,就是找三次地址,這里我就不舉例了,怕你不明白了,呵呵……你現在明白了嗎?

『玖』 二維數組如何用指針表示

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

一、動態數組方式。

完全由動態數據構成二維數組。如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列的元素。

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

數組的使用規則:

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函數逐個對數組元素賦值。

網路-數組

熱點內容
jsoupjava 發布:2025-05-14 14:38:00 瀏覽:884
影豹選哪個配置最好 發布:2025-05-14 14:28:50 瀏覽:255
定期預演算法的 發布:2025-05-14 14:24:08 瀏覽:894
interbase資料庫 發布:2025-05-14 13:49:50 瀏覽:691
微商海報源碼 發布:2025-05-14 13:49:42 瀏覽:347
分布式緩存部署步驟 發布:2025-05-14 13:24:51 瀏覽:611
php獲取上一月 發布:2025-05-14 13:22:52 瀏覽:90
購買雲伺服器並搭建自己網站 發布:2025-05-14 13:20:31 瀏覽:689
sqlserver建立視圖 發布:2025-05-14 13:11:56 瀏覽:486
搭建httpsgit伺服器搭建 發布:2025-05-14 13:09:47 瀏覽:256