我刚刚开始编程,所以指针和数组让我感到困惑。 该程序只是将0-9中的随机数分配到数组中并打印出来
(#include <stdio.h> #include <stdlib.h> #include <time.h>)
int function(int *num[]){
int i;
for(i=0; i<10; i++){
srand((unsigned)time(NULL));
*num[i] = rand()%10;
printf("%d", *num[i]);
}
return 0;
}
int main(){
int num[10];
function(&num); // incompatable pointer type (how do i fix this?)
return 0;
}
三江源
答案 0 :(得分:6)
将您的代码更改为以下内容:
int function(int num[]){
int i;
for(i=0; i<10; i++){
srand((unsigned)time(NULL));
num[i] = rand()%10;
printf("%d", num[i]);
}
return 0;
}
int main(){
int num[10];
function(num);
return 0;
}
在main()
中,您正在分配一个包含10个整数的数组。对function(num)
的调用将此数组的地址(技术上,数组的第一个元素的地址)传递给function()
函数。在参数声明中,int num[]
几乎完全等同于int *num
(我会让你思考那个)。最后,当您从函数中访问num[]
的元素时,您不需要任何额外的*
。使用num[i]
,您将访问i
指向的数组的num
元素。
可能有助于记住在C中,以下内容完全相同:
num[i]
*(num+i)
答案 1 :(得分:1)
您不需要传入指向数组的指针。只需传入数组。我在下面修改了你的指针代码。
此外,您不应该通过for循环重复每次迭代的种子(srand)。
int function(int num[]){
int i;
srand((unsigned(time(NULL));
for(i=0; i<10; i++){
num[i] = rand()%10;
printf("%d", num[i]);
}
return 0;
}
int main(){
int num[10];
function(num);
return 0;
}
答案 2 :(得分:1)
这完全取决于你最终想要达到的目标。
(1)如果函数function
旨在与运行时大小数组一起使用,则必须将指针传递给数组的第一个元素。这是通过以下等效声明
int function(int *num)
或
int function(int num[])
在函数内部,您必须以
的形式访问传递的数组num[i] = rand() % 10;
你将你的职能称为
function(num);
当然,当数组大小是运行时值时,将该大小传递给函数也是有意义的,这意味着您的函数应具有以下接口
int function(int num[], size_t n)
并为大小为n
的数组实现它,而不是直接将10
硬编码到您的实现中。
(2)如果你的函数function
打算用于固定编译时大小的数组(在这种情况下是10
),那么更好的方法是是传递指向整个数组的指针。它通过以下声明来实现
int function(int (*num)[10])
在函数内部,您必须以
的形式访问传递的数组(*num)[i] = rand() % 10;
你将你的职能称为
function(&num);
所以它是(1)或(2)。
您目前在代码中拥有的内容看起来像这两种方法的混合。更确切地说,您的代码看起来像是尝试实现第二个方法,但它缺少一些重要的括号:)
到目前为止,大多数答案建议使用第一种方法。但是,在您的情况下,看到数组大小实际上是编译时常量,我建议坚持使用第二种方法。
答案 3 :(得分:0)
使用int *num
或int num[]
,不要像现在一样使用它们(int *num[]
)。数组作为指向第一个元素的指针传递给函数,即int *num
,相当于int num[]
。