怎麼讓二維指標指向二維陣列,怎麼讓乙個二維指標指向乙個二維陣列

2021-12-16 20:10:07 字數 4800 閱讀 8750

1樓:徐光豬

樓主,我想講講二級指標的原理,它是指向記憶體位址的位址,簡單說就是取兩次位址,一維陣列,二維陣列它們的元素都對應擁有乙個暫時分配的記憶體位址,就是說只需要乙個一級指標就可以完成取址,如果你用乙個二級指標去取址是會取到亂值,如果是系統的位址系統就會崩潰(我就是試過用指標把編譯器搞崩潰了),我下面例子說明一下:

一級指標取址:

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=;/*定義乙個指標陣列*/

char **p;/*二級指標*/

p=a;

printf("%s",*p);/*輸出12*/

這裡我解釋一下,定義乙個指標陣列,就是陣列裡面又有位址,你仔細看看,陣列有位址,指標陣列裡面的字串如("12")也是有位址的,這樣就需要用乙個二級指標指向它了,就是二級定址,這是*p就不再是元素,就變成字串"12"的首位址,由於系統自動移動指標,所以就輸出12

呵呵,如果你明白,那麼**指標也是同樣道理,定義乙個指向指標的指標陣列,用乙個

**指標實現**定址,就是找三次位址,這裡我就不舉例了,怕你不明白了,呵呵……你現在明白了嗎?

2樓:胡敏

#define n 2

typedef char t_array[n][n];

t_array aa;

t_array * p = &aa;

3樓:

實現**:

int a[m][n];

int *p = &a[0][0];

通過p[i*n+j]訪問a[i][j]

在c語言和c++語言中,陣列元素全為指標的陣列稱為指標陣列。

一維指標陣列的定義形式為:「型別名 *陣列識別符號[陣列長度]」。

例如,乙個一維指標陣列的定義:int *ptr_array[10]。

指向二維陣列的指標

4樓:小舅舅有點帥

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

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout

0012feb8

0012feb8

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout<<*p

0012feb8

這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加乙個*操作符,如下:

cout<<**p<這時輸出結果自然就會和(*p)[0]一樣是1了。

擴充套件資料

設p是指向二維陣列a[m][n]的指標變數,則有:

int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。

如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j

相應的如果用p1來表示,則為*(p1+i)+j

元素a[i][j]相應的指標表示為:

*( p+i*n+j)

相應的如果用p1來表示,則為*(*(p1+i)+j)

同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如:int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是乙個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

5樓:匿名使用者

一、你的 float score 陣列定義的是:乙個3行、4列的二維浮點陣列,陣列的元素為浮點數。如果你換個格式書寫就清晰了!

float score[3][4]=,,};

在呼叫的過程中,score 就是這個陣列的首位址,指向的是浮點陣列。score + 1 指向的是陣列。

二、你的 float *p 定義的是:乙個指向浮點數的指標。這個是一維的。

在呼叫的過程中,float 指向的是 xx。乙個浮點數字。

兩個的定義不同,所以引數傳遞過程中會出錯。

三、你的 float (*p)[4] 定義的是:乙個指向含有四個元素的浮點陣列的指標。

在呼叫的過程中,float 指向的是,由四個浮點數組成的陣列。

這時兩個定義相同,所以引數傳遞過程中沒有錯誤。

四、有個建議,你的程式書寫格式不清晰,不利於你糾錯和修改,應該盡量的清晰、明確,不建議使用簡化方式定義引數。

作為乙個軟體工作者,應該盡量使程式流暢、格式清晰、易讀,這是乙個軟體工作者最基本的職業素養。

格式化後,程式如下,會清晰很多:

#include

void main()

,,};

search(score,2);

} void search(float (*p)[4],int n)/*這裡的 float *p 好像有問題*/

printf("\n");}

6樓:匿名使用者

p[0]指向陣列a的起始位址

p[9]野指標

普通的指標變數可以指向二維陣列嗎?

7樓:麥香甜甜圈

當然可以。因為二維陣列在記憶體中也是按照一維方式存放的(記憶體單元是一維的)。下面有個參考程式你可以試試。

#include

void main()

;int *p=a;

printf("%d\n",*p);//結果輸出1,將*p改寫成*(p+1)則輸出2,改寫成*(p+7)則輸出8,可見*p可以指向二維陣列中的任何乙個元素。}

8樓:匿名使用者

二維陣列是指標的指標

它本身是個指標,指向乙個指標陣列,該指標陣列的每個元素都是個指標,指向該行(或者列)的第乙個元素

9樓:未曾冷卻

可以只要資料型別能夠配套就可以了

二維陣列的資料型別也是int

所以int型的指標可以用

10樓:

可以,二維陣列其實還是一維陣列,沒有本質的區別。

比如 int a[3[4];

我們可以

int *p = &a[0][0];

這樣可以用p直接訪問a;

而且2樓的說法欠妥,二維陣列不是指向指標的指標,他只有乙個指標,指向某段記憶體,而且此段記憶體記憶體的是資料,而非指標。

11樓:影豐

可以c中沒有真正意義上的二維陣列,是通過一維陣列擴充套件實現的,陣列的每一項再存放指向一維陣列的手指標。例如:

int a[4][5];

int (*p)[5]

p=a這裡的p即為a[4]的首位址,也就是說p指向了4*5的陣列,指標裡的5表示第二維度陣列的長度即第一行資料的個數,如果b中int (*p)[<5],則會不夠儲存a中陣列第二維度的長度,就會出錯。

最終儲存的二維陣列將會全部成一維陣列,所以你直接申明int *p 指向該二維陣列,那麼這裡的p即為a[0][0],p+6即為a[1][0]

12樓:夢想窗外

給你乙個參考例子,它們的關係可以從例子中看到。

#include

int main()

p1 = a;

for (i = 0; i < 3; ++i)putchar('\n');

return 0;}

二維陣列和二級指標的問題,二級指標和二維陣列行指標

為什麼很多人都認為二維指標和二維陣列等價呢,我以前學c時沒看到過這話啊.c語言中陣列名相當於乙個一級指標,比如int a 5 a就等價於int 而二維陣列int a m n 本質上是長度為m的一維陣列,其陣列元素是長度為n的一維int陣列,因此二維陣列的陣列名就等價於 長度為n的一維陣列型別的指標 ...

c 二維陣列排序問題,C 二維陣列sort函式排序問題

include 寫的比較簡單,原理你應該都知道了,後面的,就是 開始做的那個沒刪 void main for i 0 i 12 i 冒泡 for j 0 j 12 j if a j 4 j 4 a j 1 4 j 1 4 看起來有點複雜,其實就是 12個數分成3行4列,對應的行數就是j 4,列數j ...

二維陣列與矩陣的區別?二維陣列和矩陣的區別

二維陣列是程式語言中的叫法,矩陣是數學教材上的教法。它們之間沒多大區別。如果把有些規定說明一致的話,應該是一樣的。其實是一樣的。int a int b 3 3 a b 那麼陣列名就是首個元素位址。a 1就是b 1 0 或者b 1 的位址。二維陣列和矩陣的區別 二維陣列是矩陣的一種實現方式,就是在程式...