不兼容的指针类型

时间:2010-11-02 01:38:28

标签: c arrays function pointers types

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

三江源

4 个答案:

答案 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 *numint num[],不要像现在一样使用它们(int *num[])。数组作为指向第一个元素的指针传递给函数,即int *num,相当于int num[]