从不兼容指针类型传递参数1'recievematrix'

问题描述:

#include<stdio.h> 

Funtions prototypes 
int functiondouble(int b); 
void notreturnanything(int a, int b); 
void byreference(int *b); 
void receivevector(int v[]); 
void recievematrix(int m[][1]); 

int main() { 
    int c; 
    printf("%d\n",functiondouble(5)); 
    notreturnanything(3,9); 
    c = 0; 
    byreference(&c); 
    printf("%d\n",c); 
    int a[10], b[3][4]; 
    receivevector(a); 
    recievematrix((int)b); // <----- warning: passing argument 1 of 'recievematrix' from incompatible pointer type [enabled by default]| 
    return 0; 
} 

int functiondouble(int b) { 
    int a; 
    a = 2*b; 
    return a; 
} 

void notreturnanything(int a, int b) { 
    printf("%d\n",a+b); 
} 

没问题。这两个功能没有问题。他们收到一个没有问题的价值。从不兼容指针类型传递参数1'recievematrix'

void byreference(int *b) { 
    *b = 7; 
} 

void receivevector(int v[]) { 
    scanf("%d", &v[0]); 
} 

void recievematrix(int m[][1]) { 
    scanf("%d", &m[1][1]); 
} 

这是一个证明如何在C中工作的数组,但拉错误而不是错误在哪里。

+0

为了代码的可读性,建议为函数和变量名称使用'骆驼'情况 – user3629249 2015-03-31 22:16:01

+0

应始终检查scanf()函数的返回值和函数系列,以确保操作在此调用上成功 – user3629249 2015-03-31 22:18:53

+0

(也许是类似的调用)'recievematrix((int)b);'被调用的函数需要一个指向int的指针,而不是int。也许使用:'recievematrix((int *)b);' – user3629249 2015-03-31 22:22:58

尝试

void recievematrix(int m[3][4]) 

而且

recievematrix(b); 

这...

int b[3][4]; 

...声明四个int三大数组的数组。鉴于该声明,在大多数表达式中,数组名b被转换为指向其第一个元素的指针;也就是指向四个数组的指针intint (*)[4]);

这...

int m[][1] 

...声明一个int阵列的未指定数量的阵列。在函数的参数列表中,它被转换为指向一个intint (*)[1])的数组的指针。

int (*)[4]int (*)[1]不兼容。要解决此警告(你当然应该做的),而不改变变量b的类型,receivematrix()签名更改为

void recievematrix(int m[][4]); 

void recievematrix(int (*m)[4]); 

甚至

void recievematrix(int m[3][4]); 

对于这件事,即使

void recievematrix(int m[17][4]); 

会使警告无效,但我不建议使用它。