C語言中 二維陣列與三維陣列在使用過程中主要起什麼作用?它表

2021-03-20 05:14:21 字數 6511 閱讀 7597

1樓:匿名使用者

實際上是資料的一種組織方式,你可以想象成:

二維陣列:行x列的長方形

三位陣列:長x寬x高 的長方體

在c語言中,陣列的意義,就是讓陣列的名字可以當作指標來使用,這樣就能很方便的定位資料。

比如你有一個陣列arry[300][300][300]那麼他能儲存300*300*300=27000000個資料,如果要移動指標,那麼非常浪費,你需要移動27000000次才能移動到最後,而用陣列的名字*(arry[300][300]++)只要300次就可以移動到最後一個資料。

當然陣列和指標不僅僅是這個用途,還有更多精妙的用法等你靈光一現。

2樓:匿名使用者

多維其實都可以只用一維陣列實現相同的效果的

3樓:匿名使用者

當你需要處理很多同一性質的資料時就需要。

c語言中一維陣列和二維陣列以及多維陣列,有什麼作用?

4樓:鐳毅

一維陣列:vector

多維陣列:matrix

現在有很多陣列的運算已經封裝,比如.vector,matrixmatrix何用? 相信我們都學過矩陣。。。矩陣有何用? 太多了舉一個例子:

圖形影象處理時用到的,平移、旋轉---〉靠什麼? 矩陣。。。。

作用太多了

5樓:匿名使用者

運用陣列可以簡化程式,使程式更加高效,也為以後學習指標型別的陣列打下了基礎。這些你會在以後的學習中感受的到。

6樓:板金鑫功友

二維陣列可以看成特殊的一維陣列,它們在記憶體中都是條狀儲存狀態,只是一維陣列在表達上不如二維陣列方便(非絕對)

c語言:三維陣列賦值給二維陣列,為什麼可以這樣?裡面的數值不會改變了嗎?

7樓:

你的陣列a其實仍然是二維陣列,因為你給的值顯然是一個二維陣列的值即1,2,3

3,2,1

2,5,6

你並沒有真正做一個三維陣列,所以賦給二維陣列完全沒問題,陣列b的值仍然是像上面那樣的形式

c語言二維陣列定位

8樓:匿名使用者

你用的是一個二級指標,這個不能指向二維陣列

如果要用指標,指二維陣列,可以這樣定義,int (*p)[12]=a;

然後用p[4][4]就可以定位

9樓:__戀o胤

準確來說**p並不是二維指標,它是二級指標,是指向指標的指標,所以用它來指向陣列是不可行的。

可以 用ls所說 int (*p)[4] = a;

10樓:

int a[10][10],**p;

p=(int **)&a[4][4];

就可以了。但這樣做有何用?

11樓:匿名使用者

**p 二級指標

**p->a[4][4]

*p->&a[4][4];

12樓:劉文正粉絲

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

13樓:樑昌仔

*(*(p+4)+4)

c語言中二維陣列*(a+i)的意義

14樓:

*(a+i)——二維陣列第i行(從0起算)第一個元素的地址。

15樓:匿名使用者

所謂*(a+i)等價於a[i],而a[i]是一個陣列名,那麼a[i] = &a[i][0],陣列名等與首元素的地址

c語言中二維陣列的定義問題

16樓:匿名使用者

正確寫法如下:

char

fd_jgf1[maxitemlen+1]=;說明:把null去掉

17樓:匿名使用者

1. 二維陣列的第一個維度預設是:

舉個例子:int tar[2] = ;

因為大括號中有4個元素,而且第二個維度是2,所以就可以計算出來第一維度是2.所以是可以預設的。

2. 你的這個例子中,第一維預設的應該是(7*8+1)/(__maxitermlen__+1) 向上取整。

3. 因為fd_jpf1[i]是一個一級指標,儲存的是地址,設定為null表示為空。在這裡應該是把它當做這個陣列中有效元素的結束的標誌了。

18樓:孔培勝羅婉

以二維來說,假若給定的陣列為a[3][5],這是一個二維陣列,在c語言中,計算機在執行這個陣列前,二維陣列就是

a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[0][4]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

a[1][4]

a[2][0]

a[2][1]

a[2][2]

a[2][3]

a[2][4]

不要看我將它排成3行,其實在計算機內部,它是在一行連續排列的,因此a[0]就代表a[0][0],a[1]代表a[0][1],a[4]代表a[0][4],a[5]代表a[1][0],怎麼來不就是行號1*每行的元素個數+0=1*5+0=5;

a[2][2]代表的是2*5+2=12,所以代表a[12].解釋清楚了嗎?

理解了別忘了給我加分(選我)。

c語言中怎麼用二維陣列作為函式引數

19樓:我們最2的人

二維陣列作為函式引數,實參可以直接使用二維陣列名,在被呼叫函式中對形引數組定義可以指定所有維數的大小,也可以省略第一維的大**明,如:

它們是合法且等價,也可以使用如下形式:

但不能省略第二維的大小,如下面的定義是不合法的,編譯時會出錯:

因為從實參傳遞來的是陣列的起始地址,如果在形參中不說明列數,編譯器將無法定位元素的的位置。

20樓:韌勁

可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大**明,如:

void func(int array[3][10]);

void func(int array[10]);

二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:

void func(int array);

因為從實參傳遞來的是陣列的起始地址,在記憶體中按陣列排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多 少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:

void func(int array[3]);實引數組維數可以大於形引數組,例如實引數組定義為:

void func(int array[3][10]);

而形引數組定義為:

int array[5][10];

這時形引數組只取實引數組的一部分,其餘部分不起作用。

對於陣列 int p[m][n];

如果要取p[i][j]的值(i>=0 && i

p + i*n + j;

void func(int array[3][10]);

void func(int array[10]);

變為:void func(int **array, int m, int n);

在轉變後的函式中,array[i][j]這樣的式子是不對的(不信,大家可以試一下),因為編譯器不能正確的為它定址,所以我們需要模仿編譯器的行為把array[i][j]這樣的式子手工轉變為:

*((int*)array + n*i + j);

在呼叫這樣的函式的時候,需要注意一下,如下面的例子:

int a[3][3] =

, ,};func(a, 3, 3);

根據不同編譯器不同的設定,可能出現warning 或者error,可以進行強制轉換如下呼叫:

func((int**)a, 3, 3);

其實多維陣列和二維陣列原理是一樣的,大家可以自己擴充的多維陣列,這裡不再贅述。寫到這裡,我先向看了這篇文章後悔的人道歉,浪費你的時間了。下面是一 個完整的例子程式,這個例子程式的主要功能是求一個圖中某個頂點到其他頂點的最短路經,圖是以鄰接矩陣的形式存放的(也就是一個二維陣列),其實這個函式 也是挺有用的,但是我們這篇文章的重點在於將二維陣列作為函式的引數傳遞。

21樓:匿名使用者

很簡單的,陣列作為函式引數傳遞的時候只要是陣列名就可以了,因為陣列名本身就是陣列的首地址 .給個程式看看

#include

#define n 3

int array[n][n];

void main()

//呼叫矩陣轉置函式

convert(array);

printf("\n");

for(i=0;i

void convert(int array[3]) }

22樓:混世達人

建議這樣的專業語言問題,去**群的c語言群去諮詢,那裡面有很多的高手。

23樓:匿名使用者

直接就寫陣列的名稱就可以了,比如你定義的陣列是a[4][3],在實參中填a就可以,在型參中定義一個二維陣列或一個指標變數就可以讓二維陣列的值在函式中使用了!

24樓:匿名使用者

可以用指標的形式表示,或者用二維陣列顯示錶示

c語言中二維陣列在記憶體中是按什麼優先存放的?

25樓:二蛋的哥哥哥

c語言中

二維陣列是按行優先儲存的

即 在記憶體中存一個二維陣列時 先把陣列中第一行的陣列元素存完 再接著存下一行的 直到存完。

ps:定義一個二維陣列 如 int a[m][n] 該陣列為m行 n列的矩陣,在記憶體中 這樣順序存的:

a[0][0] a[0][1] ... a[0][n-1] a[1][0] a[1][1]...

不知道是不是幫到你的忙瞭望採納

26樓:匿名使用者

比如a[2][3];的存放順序是:

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

27樓:米呀你

c語言陣列是行優先的

c語言二維陣列用指標表示的問題

28樓:匿名使用者

#include

void main()

;int (*p)[4];

p=a;

printf("%d",*(p)[3]);

}首先你沒有理解int (*p)[4];

他的意思就是含有4個指標的陣列 由於int a[3][4]只有3行,所以*(p)[3]這個地方就越界了

如果*(p)[2]地址中的值就是17 *(p)[1] 就是9 ,*(p)[0]就是1

如果你要列印7 *((p)[0]+3)

29樓:匿名使用者

因為p[3]沒有指向a[0][3],你加條語言

printf("%x\t%x\n", p[3], &(a[0][3]));

就知道了。

30樓:匿名使用者

printf("%d",(*p)[3]);

31樓:貴藹堂馨蓉

你說要放到另外一個陣列b中,但是沒看到你定義新的陣列,所以我就按我自己的理解做了。

#include

#define

rows

3#define

cols

4double

copy_ptr(double

*tar);//一個變數就夠了

//rows和cols本來就是define的,全域性intmain(void),,

,};double

*p=source[0];

printf("taget[%d][%d]=",rows,cols);

copy_ptr(p);

printf("\n");

while(1)

{}return0;}

double

copy_ptr(double

*tar)

}//直接輸出了……

return0;}

有問題歡迎**……

32樓:匿名使用者

#include

int main()

;int (*p)[4];

p=a;

printf("%d",*(*p+2));

return 0;

}//你沒有理

解多維陣列a的意思

為什麼在c語言中二維陣列第二維下標可以越界

因為陣列是連續儲存的,所以a 0 3 就是第四個儲存的資料,你可以試試a 0 4 越界復是肯定的,但是越界不代表程 制序會出 bai錯,你這個地方越界du後訪問的正好是下一個元素4,是zhi一個dao有效值,所以不會出錯。可以試試訪問a 3 3 這個時候不一定會訪問到什麼東西,這時就很容易出現記憶體...

c語言二維陣列迴圈賦值,C語言二維陣列迴圈賦值

這個只是陣列值的大小和行列的關係而已 就代表改數的值等於所在行數的4倍加所在列數加1 c語言中怎樣實現對二維陣列元素進行賦值並輸出。可以按照下面步驟進行定義二維陣列並輸出 1 定義二維指標。2 確定內陣列維數,即行數容和列數。3 申請行數個一維指標大小空間,並賦值給二維指標。4 對於每個一維指,申請...

c語言三維陣列三維陣列怎麼理解c語言

先說二維,可以這麼理解 int n 3 有3個int 那麼,int m 5 3 有5個int 3 賦值時 n 1 3把3給1號 m 4 m 4 是個int 3 型別,這麼賦值,也就是這麼賦值 m 4 的 0 是5 m 4 0 5 m 4 1 9 m 4 2 4 懂了嗎?三維甚至更多維大同小異,比如 ...