为了账号安全,请及时绑定邮箱和手机立即绑定

通过引用在C中传递数组?

通过引用在C中传递数组?

C
繁花如伊 2019-11-23 12:47:53
如何在C中通过引用传递结构数组?举个例子:struct Coordinate {   int X;   int Y;};SomeMethod(Coordinate *Coordinates[]){   //Do Something with the array}int main(){    Coordinate Coordinates[10];   SomeMethod(&Coordinates);}
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

在C语言中,数组作为指向第一个元素的指针传递。它们是唯一未真正按值传递的元素(指针按值传递,但未复制数组)。这允许被调用的函数修改内容。


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

}

现在,如果要更改数组本身(元素数...),则不能使用堆栈或全局数组来执行此操作,只能使用堆中动态分配的内存来执行。在这种情况下,如果要更改指针,则必须将指针传递给它:


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

   free( *p );

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

}

int main() {

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

   resize( &p, 20 );

}

在问题编辑中,您专门询问有关传递结构数组的问题。您有两种解决方案:声明一个typedef,或明确声明您正在传递一个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

您可以在声明类型时键入typedef(这是C语言中的常见用法):


typedef struct Coordinate {

   int x;

   int y;

} Coordinate;


查看完整回答
反对 回复 2019-11-23
?
翻阅古今

TA贡献1780条经验 获得超5个赞

在这里扩展一些答案...


在C中,当数组标识符作为&或sizeof的操作数出现在上下文之外时,标识符的类型从“ T的N元素数组”隐式转换为“ T的指针”,其值为隐式设置为数组中第一个元素的地址(与数组本身的地址相同)。这就是为什么当您仅将数组标识符作为参数传递给函数时,该函数将接收指向基本类型而不是数组的指针。由于仅通过查看指向第一个元素的指针就无法确定数组的大小,因此必须将大小作为单独的参数传递。


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);

    ...

}

有几种将数组传递给函数的替代方法。


有一个指向T数组的指针,而不是指向T的指针。您可以将这样的指针声明为


T (*p)[N];

在这种情况下,p是指向T的N元素数组的指针(与T * p [N]相对,其中p是指向T的N元素数组)。因此,您可以将指针传递给数组,而不是将指针传递给第一个元素:


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);

    ...

}

此方法的缺点是数组大小是固定的,因为指向T的10个元素的数组的指针与指向T的20个元素的指针的类型不同。


第三种方法是将数组包装在结构中:


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);

    ...

}

这种方法的优点是您不必操弄指针。缺点是数组大小是固定的(同样,T的10个元素的数组与T的20个元素的数组是不同的类型)。


查看完整回答
反对 回复 2019-11-23
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

C语言不支持任何类型的引用传递。最接近的等效项是将指针传递给该类型。


这是两种语言的人为例子


C ++风格的API


void UpdateValue(int& i) {

  i = 42;

}

等效的C


void UpdateValue(int *i) {

  *i = 42;

}


查看完整回答
反对 回复 2019-11-23
  • 3 回答
  • 0 关注
  • 471 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信