[英]function prototype return 2D array in C
我不是很擅長C而且我對雙陣列很困惑。 下面是我有一個問題的代碼大綱。 Main函數調用CreateRandConn函數,並將一個填充0的2D數組作為參數傳遞給它。 CreateRandConn函數將2D數組作為參數,將2DArray中的某些值從0更改為1,並將更改后的2DArray返回給main。 我想在函數原型中指出CreateRandConn函數的返回類型是一個2D數組。 我該如何表明? 我真的不懂語法。 我寫錯了什么? 我傳遞2DArray作為函數頭中的參數的方式是不正確的? 如果是這樣,我怎么寫呢? 我仍然對指針和雙數組之間的關系感到困惑。 有人可以用下面的代碼大綱來解釋它嗎? 希望有人知道我的問題是什么......
//Function prototype
int ** CreateRandConn(char * RandRoom[7], int my2DArray[7][7], char * room_dir);
//Function
int ** CreateRandConn(char * RandRoom[7], int my2DArray[7][7], char * room_dir)
{
...
return my2DArray;
}
int main()
{
int 2DArray[7][7] = {0};
2DArray = CreateRandConn(RandRoomArray, my2DArray[7][7], room_dir);
return 0;
}
我真的不懂語法。
好的,讓我們回顧一下基礎知識:
T
的N
元素數組的指針p
定義為: T (*p)[N]
現在為你舉例:
你有
int 2DArray[7][7] = ...;
為了清楚起見,我將其改為
int a[5][7] = ...;
所以這會傳遞給一個函數。 如果發生以下情況/適用:
a
的第一個元素是int [7]
int[7]
的指針將被定義為: int(*)[7]
。 所以函數的相關變量看起來像:
... func(int (*pa)[7])
pa
指向a
的第1個元素。 作為一個側面說明:從這個指針a
函數不能獲得多少元素a
實際上是“規定”,會說:有多少一前一后有效的元素a
點,將遵循,所以這需要傳遞給函數,以及:
... func(int (*pa)[7], size_t rows)
從目前為止我們學到的步驟來看,一個數組沒有被傳遞,只是指向它的第一個元素* 1被傳遞,被復制到函數的局部變量(這里是pa
)。
由此直接得出一個數組不能作為函數的返回值傳回,而只是一個指向數組元素的指針(通常是第一個)
看看如何定義指向數組的指針: T (*p)[N]
我們知道需要派生返回指向數組的指針的函數。 函數的defalcation有點需要成為上面的p
。 因此,將T
作為int
,將N
作為7,我們得到:
int (*func(int (*pa)[7], size_t rows))[7];
那么簡單的實現和用法將是:
#include <stdlib.h> /* for size_t */
#define ROWS (5)
#define COLS (7)
int (*func(int (*pa)[COLS], size_t rows))[COLS];
int (*func(int (*pa)[COLS], size_t rows))[COLS]
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t j = 0; j < COLS; ++j)
{
pa[i][j] = 0;
}
}
return pa;
}
int main(void)
{
int a[ROWS][COLS];
int (*pa)[COLS] = func(a, ROWS);
return EXIT_SUCCESS;
}
* 1(雖然草率,但經常被錯誤地稱為“ 指向數組的指針被傳遞 ”, 一般情況下它不是 ,但就在這里,因為它是一個2D數組,會說數組的元素本身就是數組)。
如果您理解了上述內容,那么僅僅是為了完整性,遵循上述函數聲明的不太奇怪的外觀(但也可能是教育程度較低;-))。 它可以通過使用typedef
構造聲明,隱藏數組指針的某種復雜聲明作為參數和返回類型。
這個
typedef int (*PA)[COLS];
定義一個指向int
的COLS
數組的類型。
所以使用PA
我們可以代替
int (*func(int (*pa)[COLS], size_t rows))[COLS];
寫
PA func(PA pa, size_t rows))[COLS];
此版本與上述相同。
是的,它看起來更簡單,但帶來的事實是,指針pa
和函數的返回值)只能通過查看它們的定義而無法識別為指針。 許多程序員認為這種結構被認為是“不好的做法”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.