不兼容的指针类型

4

我刚开始学编程,所以指针和数组让我感到困惑。 这个程序只是将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;
}

Thankyou


5
你可能希望将srand((unsigned)time(NULL));放在for()循环外面。 - No one in particular
4个回答

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],您可以访问由num指向的数组的第i个元素。
记住,在C语言中,以下内容完全相同:
num[i]
*(num+i)

2
还没有人说过这个,但他应该_实际上_将其更改为int function(int num[], size_t len)。安全第一,人民至上! - Chris Lutz

1

你不需要传递一个指向数组的指针。只需传递数组本身即可。我已经修复了你下面的指针代码。

另外,你不应该在每次循环迭代中重置种子(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; 
} 

-1 - 这并没有回答他在指针方面遇到的实际编程问题。 - David Pfeffer

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

您当前代码中的内容看起来像这两种方法的混合。更确切地说,您的代码似乎是尝试实现第二种方法,但缺少一些重要的括号:)

到目前为止给您提供的大多数答案都建议使用第一种方法。然而,考虑到在您的情况下数组大小实际上是编译时常量,我建议坚持使用第二种方法。


0
使用int *numint num[],不要像您现在一样同时使用两者(int *num[])。将数组作为指向第一个元素的指针传递给函数,即int *num,这等同于int num[]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接