3 回答

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;

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ù)組是不同的類型)。

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;
}
- 3 回答
- 0 關(guān)注
- 495 瀏覽
添加回答
舉報(bào)