網站首頁 編程語言 正文
關于二維數(shù)組在函數(shù)中的調用問題
之前在學習二維數(shù)組的時候感覺理解起來很簡單,所以理解一下就過去了,但是當自己真正的去用二維數(shù)組數(shù)組解決一些問題(特別是在函數(shù)調用二維數(shù)組的過程中)才真正發(fā)現(xiàn)原來使用起來還是要去注意一些細節(jié)的。廢話不多說,直接上干貨!
函數(shù)調用二維數(shù)組
在函數(shù)中調用二維數(shù)組的具體格式如下:
1、聲明:這是聲明的兩種格式,在這里定義的是一個N*5的二維字符數(shù)組,各位看官一定要注意,在聲明的過程中可是要將二維數(shù)組中第二個長度參數(shù)進行標明的呀。
2、定義:和聲明的格式沒有什么大的區(qū)別,只不過是要如果要采用第二種聲明方式的話要在定義時補充完整形參名
3、如果要去在函數(shù)中只使用二維數(shù)組中的其中一個一維數(shù)組時
我的個人做法是正常的在函數(shù)聲明中正常定義一個二維數(shù)組,之后再在函數(shù)申明中額外添加一個整數(shù)參數(shù)去來限定在函數(shù)中使用二維數(shù)組中具體哪一個一維數(shù)組,例子如下:
所寫這個函數(shù)是為了去分別算出這個二維數(shù)組中的每一個一維數(shù)組的平均值,所以我在定義函數(shù)時加了一個n來表示我要算哪一個一維數(shù)組的平均值。
4、在結構體中千萬不要去使用二維數(shù)組!!!
當初我在寫結構體是想當然的去使用了二維數(shù)組,結果。。。
如果在使用結構體的過程中需要用到類似于二維數(shù)組的儲存數(shù)據(jù)的特性時,我們應當去選取用結構體數(shù)組來解決相應的問題。結構體數(shù)組相當一二維數(shù)組的一維數(shù)組,結構體中所定義的一些信息精細化相當于二維數(shù)組中一維數(shù)組的信息。
好了,這就是我這個小白中的小白在實際使用的過程中所出現(xiàn)的一些情況。
?二維數(shù)組如何放到函數(shù)中使用
要想在函數(shù)中帶入一個二維數(shù)組
前提首先我們要知道二維數(shù)組在內存中是如何分布的
假設定義一個二維數(shù)組 arr[3][3];
內存中的是這樣儲存的:
圖解:
也就是說,二維數(shù)組的內存關系是連續(xù)的,因此如果我們在函數(shù)中帶入一個數(shù)組只需要數(shù)組的第一排的第一個元素的地址和行數(shù)和列數(shù)三個條件
下面以一個二維矩陣的轉置為例
關鍵點是如何利用二維數(shù)組的第一排首元素的地址去把整個數(shù)組表示出來
假設:
數(shù)組 int arr[3][3];
arr的值為第一排首元素地址
已知行列數(shù)為3,令int *p=arr;
可以用 *(p+i*3+j)表示第i排第j列的元素
因此函數(shù)只需要定義一個接收數(shù)組第一排首地址元素的指針類型的形參即可
下面見完整代碼:?
#include<stdio.h>
#include<windows.h>
void Array_transpose(int *arr, int rank)//rank為數(shù)組的列數(shù) 代表每排有多少個元素
{
int i;
int j;
int temp;//temporary 臨時的
for (i = 0; i < rank; i++)
{
for (j = 0; j < i; j++)
{
//交換沿著對角線對稱的兩個數(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])得到的是第一排的元素個數(shù)
{
if (a[i][j])
printf("▇");
else
{
printf(" ");
}
}
printf("\n");
}
system("pause");
return 0;
}
代碼實現(xiàn)的功能:
不使用Array_transpose()
原本輸出應該是這樣
使用Array_transpose()
轉置后
利用代碼中的方法可以實現(xiàn)二維數(shù)組的轉置,可以作為俄羅斯方塊的色塊變化方向的基礎
原文鏈接:https://blog.csdn.net/qq_41022829/article/details/80452321
相關推薦
- 2022-09-06 Python實現(xiàn)周日歷與時間相互轉換_python
- 2022-05-13 C++ Poco庫的編譯和使用
- 2023-12-14 Excel中——日期列后添加星期
- 2022-08-05 詳解C#通過反射獲取對象的幾種方式比較_C#教程
- 2023-01-27 如何使用Redux?Toolkit簡化Redux_React
- 2022-04-26 jQuery實現(xiàn)鎖定頁面元素(表格列)_jquery
- 2022-09-17 C++中stack的pop()函數(shù)返回值解析_C 語言
- 2022-09-25 引入DjangoRESTframework
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支