第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

聲明C函數(shù)以返回?cái)?shù)組

聲明C函數(shù)以返回?cái)?shù)組

C
哆啦的時(shí)光機(jī) 2019-10-12 19:07:02
聲明C函數(shù)以返回?cái)?shù)組如何創(chuàng)建返回?cái)?shù)組的函數(shù)?我試過這個(gè)const int WIDTH=11;const int HEIGHT=11;int main() {   char A[WIDTH][HEIGHT];   A=rand_grid(WIDTH,HEIGHT);   return 0;}// Initializes a random board.char[][] rand_grid(int i, int k) {   char* A[i][k];   for(j=0;j<i;++j) {     for(l=0;l<k;++l) {       A[j][l]=ran(10);     }   }   return A;}// Returns a random number from the set {0,...,9}.int ran(int i) {   srand((unsigned int) time(0));   return(rand()%10);}
查看完整描述

3 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

有幾件事要指出。

首先,不能像在這里那樣分配數(shù)組對(duì)象:

char A[WIDTH][HEIGHT];  A=rand_grid(WIDTH,HEIGHT);

數(shù)組類型的對(duì)象是不可修改的。

其次,C中的函數(shù)不能返回?cái)?shù)組類型。他們可以回來指針但是,對(duì)于數(shù)組:

char (*foo(int width))[HEIGHT]{
  /**
   * dynamically allocate memory for a widthxHEIGHT array of char
   */
  char (*newArr)[HEIGHT] = malloc(sizeof *newArr * width);
  /**
   * initialize array contents here
   */
  return newArr;}

語法有點(diǎn)混亂,它是

       foo                                   -- foo
       foo(int width)                        -- is a function                                             -- taking an int parameter      *foo(int width)                        -- returning a pointer     (*foo(int width))[HEIGHT]               -- to a HEIGHT-element arraychar (*foo(int width))[HEIGHT]               -- of char

對(duì)于C89,上述代碼段中的高度必須是編譯時(shí)常量積分表達(dá)式(宏、數(shù)字文字或由宏和/或數(shù)字文本組成的算術(shù)表達(dá)式)。我不確定C99是否也是這樣。

根據(jù)您發(fā)布的代碼片段,您要做的是獲取已經(jīng)分配的數(shù)組并初始化其內(nèi)容。請(qǐng)記住,在大多數(shù)上下文中,數(shù)組類型的表達(dá)式將隱式轉(zhuǎn)換為指向基類型的指針。IOW,如果將T的N元素?cái)?shù)組傳遞給函數(shù),則函數(shù)實(shí)際接收的是指向T的指針:

void foo (T *p) {...}...T arr[N];foo(arr);

對(duì)于二維數(shù)組,它有點(diǎn)丑:

void foo (T (*p)[M]) {...}...T arr[N][M];foo(arr);

這還依賴于編譯時(shí)已知的M,這限制了函數(shù)的有用性。您想要的是一個(gè)可以處理任意大小的二維數(shù)組的函數(shù)。我所知道的實(shí)現(xiàn)這一目標(biāo)的最佳方法是將指針傳遞到數(shù)組,傳遞數(shù)組中第一個(gè)元素的地址[1],并將行數(shù)和列數(shù)作為單獨(dú)的參數(shù)傳遞:

void foo(T *base, size_t rows, size_t cols) {...}...T arr[N][M];foo (&arr[0][0], N, M);

所以Rand_Grid函數(shù)看起來如下所示:

void rand_grid(char *base, size_t rows, size_t cols){
  size_t i, j;
  for (i = 0; i < rows; i++)
  {
    for (j = 0; j < cols; j++)
    {
      /**
       * Since base is a simple char *, we must index it
       * as though it points to a 1-d array.  This works if
       * base points to the first element of a 2-d array,
       * since multi-dimensional arrays are contiguous.  
       */
      base[i*cols+j] = initial_value();
    }
  }}int main(void){
  char A[WIDTH][HEIGHT];
  rand_grid(&A[0][0], WIDTH, HEIGHT);
  ...}

  1. 即使這些表情

    &A[0][0]

    A

    產(chǎn)生相同的值(A的基址),這兩個(gè)表達(dá)式的類型是不同的。第一個(gè)表達(dá)式計(jì)算為指向char的簡(jiǎn)單指針(

    char *

    ),而第二個(gè)值計(jì)算為指向char的二維數(shù)組的指針(

    char (*)[HEIGHT]).



查看完整回答
反對(duì) 回復(fù) 2019-10-13
?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

您永遠(yuǎn)不能返回已分配的堆棧(“auto“)非原始(值)類型的變量,以及struct是這樣的。對(duì)于其他類型,您需要從堆中分配內(nèi)存,使用malloc(),或?qū)?固定大小)數(shù)組包裝為struct.

如果使用的是固定大小的數(shù)組,則可以將其建模為struct并使用struct-back:

#define WIDTH  11#define HEIGHT 11typedef struct {
  unsigned char cell[WIDTH * HEIGHT];} Board;Board board_new(void){
  Board b;
  size_t i;

  for(i = 0; i < sizeof b.cell / sizeof *b.cell; i++)
    b.cell[i] = rand() & 255;
  return b;}

這很好,而且不應(yīng)該比使用顯式指針的代價(jià)更高:

void board_init(Board *b);

因?yàn)榍罢叩膕truct-back可以重寫(由編譯器)到后者。這叫做返回值優(yōu)化.



查看完整回答
反對(duì) 回復(fù) 2019-10-13
  • 3 回答
  • 0 關(guān)注
  • 530 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)