2016-02-04 126 views
-3

我在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*/ 
} 

我将如何传递数组,然后回来?

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

+1

'结构*数组[malloc的(10 *整型尺寸(结构)];'哪种语言 –

+2

'结构*数组[malloc的(10 *整型尺寸(结构)〕;'这是什么有人教' malloc()'今天错了,第二篇文章有这样一个严重问题 –

+0

这是C.对不起,这就是我学会如何分配内存给一个有10个条目的数组! – starter1011

回答

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没有通过引用传递任何东西时,通常会提到这种第二种观点。在这两种情况下,faint *而不是数组。

foo()在变量fa中的地址为maina。所以代码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 
0

代码似乎是错误的。在C中,数组总是按引用传递。

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. */ 
}