我是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*/
}
我如何传递数组然后返回?
任何链接或建议都非常有用。
答案 0 :(得分:2)
如何通过引用传递数组......?
当数组a
传递给函数foo(a)
时,它是实际参数。在C中,当一个数组传递给一个函数,而不是整个数组被赋予foo()
时,表达式a
被转换为数组的第一个元素的地址。
除非它是
sizeof
运算符,_Alignof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,具有类型''数组类型''的数组被转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素而不是左值。 ......C11dr§6.3.2.13
因此,foo()
的地址类型为int *
。我们假设值为1234
。
在函数void foo(int *fa)
内,形式参数 fa
采用值1234
。
从调用方的角度来看,这是a
受foo()
影响并且函数收到“引用”的传递引用。从函数的角度来看,这是按值传递,因为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. */
}