首頁 > 軟體

C語言之關於二維陣列在函數中的呼叫問題

2022-07-13 18:02:52

關於二維陣列在函數中的呼叫問題

之前在學習二維陣列的時候感覺理解起來很簡單,所以理解一下就過去了,但是當自己真正的去用二維陣列陣列解決一些問題(特別是在函數呼叫二維陣列的過程中)才真正發現原來使用起來還是要去注意一些細節的。廢話不多說,直接上乾貨!

函數呼叫二維陣列

在函數中呼叫二維陣列的具體格式如下:

1、宣告:這是宣告的兩種格式,在這裡定義的是一個N*5的二維字元陣列,各位看官一定要注意,在宣告的過程中可是要將二維陣列中第二個長度引數進行標明的呀。

2、定義:和宣告的格式沒有什麼大的區別,只不過是要如果要採用第二種宣告方式的話要在定義時補充完整形參名

3、如果要去在函數中只使用二維陣列中的其中一個一維陣列時

我的個人做法是正常的在函數宣告中正常定義一個二維陣列,之後再在函數申明中額外新增一個整數引數去來限定在函數中使用二維陣列中具體哪一個一維陣列,例子如下:

所寫這個函數是為了去分別算出這個二維陣列中的每一個一維陣列的平均值,所以我在定義函數時加了一個n來表示我要算哪一個一維陣列的平均值。

4、在結構體中千萬不要去使用二維陣列!!!

當初我在寫結構體是想當然的去使用了二維陣列,結果。。。

如果在使用結構體的過程中需要用到類似於二維陣列的儲存資料的特性時,我們應當去選取用結構體陣列來解決相應的問題。結構體陣列相當一二維陣列的一維陣列,結構體中所定義的一些資訊精細化相當於二維陣列中一維陣列的資訊。

好了,這就是我這個小白中的小白在實際使用的過程中所出現的一些情況。

 二維陣列如何放到函數中使用

要想在函數中帶入一個二維陣列

前提首先我們要知道二維陣列在記憶體中是如何分佈的

假設定義一個二維陣列 arr[3][3];

記憶體中的是這樣儲存的:

圖解:

也就是說,二維陣列的記憶體關係是連續的,因此如果我們在函數中帶入一個陣列只需要陣列的第一排的第一個元素的地址和行數和列數三個條件

下面以一個二維矩陣的轉置為例

關鍵點是如何利用二維陣列的第一排首元素的地址去把整個陣列表示出來

假設:

陣列 int arr[3][3];

arr的值為第一排首元素地址

已知行列數為3,令int *p=arr;

可以用 *(p+i*3+j)表示第i排第j列的元素

因此函數只需要定義一個接收陣列第一排首地址元素的指標型別的形參即可

下面見完整程式碼: 

#include<stdio.h>
#include<windows.h>
void Array_transpose(int *arr, int rank)//rank為陣列的列數  代表每排有多少個元素
{
	int i;
	int j;
	int temp;//temporary 臨時的
	for (i = 0; i < rank; i++)
	{
		for (j = 0; j < i; j++)
		{
			//交換沿著對角線對稱的兩個數的值
			//交換方法一
			/* *(arr + j * rank + i)=*(arr + j * rank + i)+*(arr + i * rank + j);   
			 *(arr + i * rank + j)=*(arr + j * rank + i)-*(arr + i * rank + j);   
			 *(arr + j * rank + i)=*(arr + j * rank + i)-*(arr + i * rank + j); */
			
			//交換方法二
			 *(arr + j * rank + i)=*(arr + j * rank + i)^*(arr + i * rank + j);
			 *(arr + i * rank + j)=*(arr + j * rank + i)^*(arr + i * rank + j);
			 *(arr + j * rank + i)=*(arr + j * rank + i)^*(arr + i * rank + j);
 
			//交換方法三
			/* temp = *(arr + j * rank + i);
			 *(arr + j * rank + i) = *(arr + i * rank + j);
			 *(arr + i * rank + j) =temp;*/
		}
	}
}
//配圖解:

 
int main()
{
	int a[5][5]=
	{
		0,0,1,0,0,
		0,0,1,0,0,
		0,0,1,0,0,
		0,0,1,0,0,
		0,0,1,0,0
 
	};
	int i, j,s;
	
	Array_transpose(a, 5);
 
		for (i = 0; i < sizeof(a)/sizeof(a[0]); i++)
		{
			//	 sizeof(a)/sizeof(a[0])得陣列的有多少排
			for (j = 0; j < sizeof(a[0])/ sizeof(a[0][0]); j++)
 			//	 sizeof(a[0])/ sizeof(a[0][0])得到的是第一排的元素個數
			{
				if (a[i][j])
					printf("▇");
				else
				{
					printf("  ");
				}
			}
			printf("n");
		}
	
	system("pause");
	return 0;
}

程式碼實現的功能:

不使用Array_transpose()

原本輸出應該是這樣

使用Array_transpose()

轉置後

利用程式碼中的方法可以實現二維陣列的轉置,可以作為俄羅斯方塊的色塊變化方向的基礎

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。 


IT145.com E-mail:sddin#qq.com