簡體   English   中英

函數原型在C中返回2D數組

[英]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;
}

我真的不懂語法。

好的,讓我們回顧一下基礎知識:

  1. 無法分配給數組變量。
  2. 如果數組傳遞給函數,它會“ 衰減 ”到指向其第一個元素的指針。
  3. 多維數組只是一個數組數組。 因此,2D陣列是1D陣列的1D陣列,3D陣列是2D陣列的1D陣列,4D陣列是3D陣列的1D陣列,依此類推......
  4. 指向類型為TN元素數組的指針p定義為: T (*p)[N]

現在為你舉例:

你有

int 2DArray[7][7] = ...;

為了清楚起見,我將其改為

int a[5][7] = ...;

所以這會傳遞給一個函數。 如果發生以下情況/適用:

  • 在上面的1.之后,不可能傳遞一個數組,好像有可能將它分配給函數內部的變量,因為無法分配數組,無法傳遞數組。
  • 在上面的2.之后,該函數需要將相關變量定義為“ 指向數組第一元素的指針 ”。
  • 在上面的3.之后, a的第一個元素是int [7]
  • 在上面的4.之后,指向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];

定義一個指向intCOLS數組的類型。

所以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM