如何通过引用C中的函数传递数组?

时间:2016-02-04 20:01:19

标签: c arrays struct

我是C的初学者。

我有以下代码:

int main()

{

struct* Array[malloc(10*sizeOf(struct)];
  /* I then fill the struct. (int num,float points)
   * I then want to pass this array that I've filled up to a sortList function,
   * which then outputs the sorted array back to main().
   *
   * Then I want to output the array as: "number, points" */
}

struct struct
{
int number;
float points;
}

void sortList()
{
  /*sort Array, then return sorted array*/
}
  

我如何传递数组然后返回?

任何链接或建议都非常有用。

3 个答案:

答案 0 :(得分:2)

  

如何通过引用传递数组......?

当数组a传递给函数foo(a)时,它是实际参数。在C中,当一个数组传递给一个函数,而不是整个数组被赋予foo()时,表达式a被转换为数组的第一个元素的地址。

  

除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,具有类型''数组类型''的数组被转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素而不是左值。 ......C11dr§6.3.2.13

因此,foo()的地址类型为int *。我们假设值为1234

在函数void foo(int *fa)内,形式参数 fa采用值1234

从调用方的角度来看,这是afoo()影响并且函数收到“引用”的传递引用。从函数的角度来看,这是按值传递,因为fa获取转换后的a的副本。在C中,当人们说C没有通过引用传递任何东西时,通常会提到第二个观点。在这两种情况下,fa都是int *而不是数组。

foo()在变量main中的地址为a fa。因此,代码fa[0] = 456设置了foo()完成后仍然可以看到的值。

void foo(int *fa) {
  fa[0] = 456;
}

int main(void) {
  int a[5];
  a[0] = 123;
  printf("%d\n", a[0]); // prints 123
  foo(a);
  printf("%d\n", a[0]); // prints 456
  return 0;
}

我使用简单的int数组来解释事情。然而原始代码还有其他问题。以下是有关如何分配内存的想法。

//  struct* Array[malloc(10*sizeOf(struct)];
struct ok12type* ok12Array = malloc(sizeof *ok12Array * 10);
....
// Do stuff with ok12Array
...
free(ok12Array);
ok12Array = NULL;
// Do _not_ do stuff with ok12Array

答案 1 :(得分:0)

代码似乎错了。 在C中,数组总是通过引用传递。

答案 2 :(得分:0)

首先,你应该命名你的结构。我在下面的示例中将其命名为typename

要分配内存,您需要:

struct typename *Array = malloc(10*sizeof(struct typename));

将数组传递给函数很简单,只需将函数声明为:

void sortList(struct typename *Array)
{
}

然后,您可以直接在函数中处理数组,因为数组总是通过引用传递,而不是按值传递。

所以你的程序可能如下:

struct typename
{
    int number;
    float points;
}

int main()

{

    struct typename *Array = malloc(10*sizeof(struct typename));
    Array[0].number = 5;
    Array[0].points = 7;
    Array[1].number = 2;
    Array[1].points = 11;

    /* Fill the rest of the array. */

    /* Sort it. */
    sortList(Array);
}



void sortList(struct typename *Array)
{
    /* Do your sorting here. */
}