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

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

通過引用在C中傳遞數(shù)組?

通過引用在C中傳遞數(shù)組?

C
繁花如伊 2019-11-23 12:47:53
如何在C中通過引用傳遞結(jié)構(gòu)數(shù)組?舉個(gè)例子:struct Coordinate {   int X;   int Y;};SomeMethod(Coordinate *Coordinates[]){   //Do Something with the array}int main(){    Coordinate Coordinates[10];   SomeMethod(&Coordinates);}
查看完整描述

3 回答

?
揚(yáng)帆大魚

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

在C語言中,數(shù)組作為指向第一個(gè)元素的指針傳遞。它們是唯一未真正按值傳遞的元素(指針按值傳遞,但未復(fù)制數(shù)組)。這允許被調(diào)用的函數(shù)修改內(nèi)容。


void reset( int *array, int size) {

   memset(array,0,size * sizeof(*array));

}

int main()

{

   int array[10];

   reset( array, 10 ); // sets all elements to 0

}

現(xiàn)在,如果要更改數(shù)組本身(元素?cái)?shù)...),則不能使用堆?;蛉?jǐn)?shù)組來執(zhí)行此操作,只能使用堆中動(dòng)態(tài)分配的內(nèi)存來執(zhí)行。在這種情況下,如果要更改指針,則必須將指針傳遞給它:


void resize( int **p, int size ) {

   free( *p );

   *p = malloc( size * sizeof(int) );

}

int main() {

   int *p = malloc( 10 * sizeof(int) );

   resize( &p, 20 );

}

在問題編輯中,您專門詢問有關(guān)傳遞結(jié)構(gòu)數(shù)組的問題。您有兩種解決方案:聲明一個(gè)typedef,或明確聲明您正在傳遞一個(gè)struct:


struct Coordinate {

   int x;

   int y;

};

void f( struct Coordinate coordinates[], int size );

typedef struct Coordinate Coordinate;  // generate a type alias 'Coordinate' that is equivalent to struct Coordinate

void g( Coordinate coordinates[], int size ); // uses typedef'ed Coordinate

您可以在聲明類型時(shí)鍵入typedef(這是C語言中的常見用法):


typedef struct Coordinate {

   int x;

   int y;

} Coordinate;


查看完整回答
反對(duì) 回復(fù) 2019-11-23
?
翻閱古今

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

在這里擴(kuò)展一些答案...


在C中,當(dāng)數(shù)組標(biāo)識(shí)符作為&或sizeof的操作數(shù)出現(xiàn)在上下文之外時(shí),標(biāo)識(shí)符的類型從“ T的N元素?cái)?shù)組”隱式轉(zhuǎn)換為“ T的指針”,其值為隱式設(shè)置為數(shù)組中第一個(gè)元素的地址(與數(shù)組本身的地址相同)。這就是為什么當(dāng)您僅將數(shù)組標(biāo)識(shí)符作為參數(shù)傳遞給函數(shù)時(shí),該函數(shù)將接收指向基本類型而不是數(shù)組的指針。由于僅通過查看指向第一個(gè)元素的指針就無法確定數(shù)組的大小,因此必須將大小作為單獨(dú)的參數(shù)傳遞。


struct Coordinate { int x; int y; };

void SomeMethod(struct Coordinate *coordinates, size_t numCoordinates)

{

    ...

    coordinates[i].x = ...;

    coordinates[i].y = ...; 

    ...

}

int main (void)

{

    struct Coordinate coordinates[10];

    ...

    SomeMethod (coordinates, sizeof coordinates / sizeof *coordinates);

    ...

}

有幾種將數(shù)組傳遞給函數(shù)的替代方法。


有一個(gè)指向T數(shù)組的指針,而不是指向T的指針。您可以將這樣的指針聲明為


T (*p)[N];

在這種情況下,p是指向T的N元素?cái)?shù)組的指針(與T * p [N]相對(duì),其中p是指向T的N元素?cái)?shù)組)。因此,您可以將指針傳遞給數(shù)組,而不是將指針傳遞給第一個(gè)元素:


struct Coordinate { int x; int y };


void SomeMethod(struct Coordinate (*coordinates)[10])

{

    ...

    (*coordinates)[i].x = ...;

    (*coordinates)[i].y = ...;

    ...

}


int main(void)

{

    struct Coordinate coordinates[10];

    ...

    SomeMethod(&coordinates);

    ...

}

此方法的缺點(diǎn)是數(shù)組大小是固定的,因?yàn)橹赶騎的10個(gè)元素的數(shù)組的指針與指向T的20個(gè)元素的指針的類型不同。


第三種方法是將數(shù)組包裝在結(jié)構(gòu)中:


struct Coordinate { int x; int y; };

struct CoordinateWrapper { struct Coordinate coordinates[10]; };

void SomeMethod(struct CoordinateWrapper wrapper)

{

    ...

    wrapper.coordinates[i].x = ...;

    wrapper.coordinates[i].y = ...;

    ...

}

int main(void)

{

    struct CoordinateWrapper wrapper;

    ...

    SomeMethod(wrapper);

    ...

}

這種方法的優(yōu)點(diǎn)是您不必操弄指針。缺點(diǎn)是數(shù)組大小是固定的(同樣,T的10個(gè)元素的數(shù)組與T的20個(gè)元素的數(shù)組是不同的類型)。


查看完整回答
反對(duì) 回復(fù) 2019-11-23
?
慕工程0101907

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

C語言不支持任何類型的引用傳遞。最接近的等效項(xiàng)是將指針傳遞給該類型。


這是兩種語言的人為例子


C ++風(fēng)格的API


void UpdateValue(int& i) {

  i = 42;

}

等效的C


void UpdateValue(int *i) {

  *i = 42;

}


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

添加回答

舉報(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)