C語(yǔ)言之關(guān)于二維數(shù)組在函數(shù)中的調(diào)用問(wèn)題
關(guān)于二維數(shù)組在函數(shù)中的調(diào)用問(wèn)題
之前在學(xué)習(xí)二維數(shù)組的時(shí)候感覺(jué)理解起來(lái)很簡(jiǎn)單,所以理解一下就過(guò)去了,但是當(dāng)自己真正的去用二維數(shù)組數(shù)組解決一些問(wèn)題(特別是在函數(shù)調(diào)用二維數(shù)組的過(guò)程中)才真正發(fā)現(xiàn)原來(lái)使用起來(lái)還是要去注意一些細(xì)節(jié)的。廢話不多說(shuō),直接上干貨!
函數(shù)調(diào)用二維數(shù)組
在函數(shù)中調(diào)用二維數(shù)組的具體格式如下:
1、聲明:這是聲明的兩種格式,在這里定義的是一個(gè)N*5的二維字符數(shù)組,各位看官一定要注意,在聲明的過(guò)程中可是要將二維數(shù)組中第二個(gè)長(zhǎng)度參數(shù)進(jìn)行標(biāo)明的呀。
2、定義:和聲明的格式?jīng)]有什么大的區(qū)別,只不過(guò)是要如果要采用第二種聲明方式的話要在定義時(shí)補(bǔ)充完整形參名
3、如果要去在函數(shù)中只使用二維數(shù)組中的其中一個(gè)一維數(shù)組時(shí)
我的個(gè)人做法是正常的在函數(shù)聲明中正常定義一個(gè)二維數(shù)組,之后再在函數(shù)申明中額外添加一個(gè)整數(shù)參數(shù)去來(lái)限定在函數(shù)中使用二維數(shù)組中具體哪一個(gè)一維數(shù)組,例子如下:
所寫(xiě)這個(gè)函數(shù)是為了去分別算出這個(gè)二維數(shù)組中的每一個(gè)一維數(shù)組的平均值,所以我在定義函數(shù)時(shí)加了一個(gè)n來(lái)表示我要算哪一個(gè)一維數(shù)組的平均值。
4、在結(jié)構(gòu)體中千萬(wàn)不要去使用二維數(shù)組!?。?/strong>
當(dāng)初我在寫(xiě)結(jié)構(gòu)體是想當(dāng)然的去使用了二維數(shù)組,結(jié)果。。。
如果在使用結(jié)構(gòu)體的過(guò)程中需要用到類(lèi)似于二維數(shù)組的儲(chǔ)存數(shù)據(jù)的特性時(shí),我們應(yīng)當(dāng)去選取用結(jié)構(gòu)體數(shù)組來(lái)解決相應(yīng)的問(wèn)題。結(jié)構(gòu)體數(shù)組相當(dāng)一二維數(shù)組的一維數(shù)組,結(jié)構(gòu)體中所定義的一些信息精細(xì)化相當(dāng)于二維數(shù)組中一維數(shù)組的信息。
好了,這就是我這個(gè)小白中的小白在實(shí)際使用的過(guò)程中所出現(xiàn)的一些情況。
二維數(shù)組如何放到函數(shù)中使用
要想在函數(shù)中帶入一個(gè)二維數(shù)組
前提首先我們要知道二維數(shù)組在內(nèi)存中是如何分布的
假設(shè)定義一個(gè)二維數(shù)組 arr[3][3];
內(nèi)存中的是這樣儲(chǔ)存的:
圖解:
也就是說(shuō),二維數(shù)組的內(nèi)存關(guān)系是連續(xù)的,因此如果我們?cè)诤瘮?shù)中帶入一個(gè)數(shù)組只需要數(shù)組的第一排的第一個(gè)元素的地址和行數(shù)和列數(shù)三個(gè)條件
下面以一個(gè)二維矩陣的轉(zhuǎn)置為例
關(guān)鍵點(diǎn)是如何利用二維數(shù)組的第一排首元素的地址去把整個(gè)數(shù)組表示出來(lái)
假設(shè):
數(shù)組 int arr[3][3];
arr的值為第一排首元素地址
已知行列數(shù)為3,令int *p=arr;
可以用 *(p+i*3+j)表示第i排第j列的元素
因此函數(shù)只需要定義一個(gè)接收數(shù)組第一排首地址元素的指針類(lèi)型的形參即可
下面見(jiàn)完整代碼:
#include<stdio.h> #include<windows.h> void Array_transpose(int *arr, int rank)//rank為數(shù)組的列數(shù) 代表每排有多少個(gè)元素 { int i; int j; int temp;//temporary 臨時(shí)的 for (i = 0; i < rank; i++) { for (j = 0; j < i; j++) { //交換沿著對(duì)角線對(duì)稱(chēng)的兩個(gè)數(shù)的值 //交換方法一 /* *(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])得數(shù)組的有多少排 for (j = 0; j < sizeof(a[0])/ sizeof(a[0][0]); j++) // sizeof(a[0])/ sizeof(a[0][0])得到的是第一排的元素個(gè)數(shù) { if (a[i][j]) printf("▇"); else { printf(" "); } } printf("\n"); } system("pause"); return 0; }
代碼實(shí)現(xiàn)的功能:
不使用Array_transpose()
原本輸出應(yīng)該是這樣
使用Array_transpose()
轉(zhuǎn)置后
利用代碼中的方法可以實(shí)現(xiàn)二維數(shù)組的轉(zhuǎn)置,可以作為俄羅斯方塊的色塊變化方向的基礎(chǔ)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 遞歸遍歷文件并計(jì)算MD5的實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于C++ 遞歸遍歷文件并計(jì)算MD5的實(shí)例代碼,有興趣的朋友們可以學(xué)習(xí)參考下。2021-07-07Qt MQTT開(kāi)發(fā)環(huán)境搭建的實(shí)現(xiàn)示例
本文主要介紹了Qt MQTT開(kāi)發(fā)環(huán)境搭建的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C++實(shí)現(xiàn)簡(jiǎn)單版通訊錄管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單版通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C語(yǔ)言深入分析數(shù)組指針和指針數(shù)組的應(yīng)用
在C語(yǔ)言和C++等語(yǔ)言中,數(shù)組元素全為指針變量的數(shù)組稱(chēng)為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類(lèi)型、指向相同數(shù)據(jù)類(lèi)型的指針變量。指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便、靈活2022-04-04C/C++實(shí)現(xiàn)樹(shù)操作的實(shí)例代碼
這篇文章主要介紹了C/C++實(shí)現(xiàn)樹(shù)操作的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02cin.get()和cin.getline()之間的區(qū)別
以下是對(duì)cin.get()和cin.getline()的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-09-09詳解C/C++高精度算法的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C/C++中高精度算法(加減乘除)的簡(jiǎn)單實(shí)現(xiàn),方便以后需要時(shí)拷貝使用。感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12