来自不兼容指针类型错误的C赋值

来自不兼容指针类型错误的C赋值,c,function,pointers,parameter-passing,C,Function,Pointers,Parameter Passing,将整数指针传递给另一个函数时,第14行出现不兼容类型错误。谁能解释一下为什么以及如何解决这个问题 #include<stdio.h> int check_similar(int *pa, int *pb); int main() { int a[5], b[5], i; for (i=0; i<5; i++){ scanf("%d", &a[i]); } for (i=0; i<5; i++){

将整数指针传递给另一个函数时,第14行出现不兼容类型错误。谁能解释一下为什么以及如何解决这个问题

#include<stdio.h>

int check_similar(int *pa, int *pb);

int main()
{
    int a[5], b[5], i;
    for (i=0; i<5; i++){
        scanf("%d", &a[i]);
    }
    for (i=0; i<5; i++){
        scanf("%d", &b[i]);
    }
    if (check_similar(&a, &b))
        printf("Strictly identical");
    else
        printf("Not identical");
}

int check_similar(int *pa, int *pb)
{
    int i=0;
    while (*(pa+i)==*(pb+i)){
        i++;
    }
    if (i==5)
        return 1;
    else
        return 0;
因为a和b的定义如下:

int a[5], b[5]
每个符号都指向数组的第一个元素,因此满足了传递参数地址而不使用运算符&:

您看到的不兼容类型错误是因为通过使用&运算符,传递的变量类型实际上是int*[5]。由于数组类型会退化为简单的指针类型,因此被调用函数会将每个参数视为int**。原型要求这些参数类型为int*

将其更改为以下内容将解决此问题:

if (check_similar(a, b))
因为a和b的定义如下:

int a[5], b[5]
每个符号都指向数组的第一个元素,因此满足了传递参数地址而不使用运算符&:

您看到的不兼容类型错误是因为通过使用&运算符,传递的变量类型实际上是int*[5]。由于数组类型会退化为简单的指针类型,因此被调用函数会将每个参数视为int**。原型要求这些参数类型为int*

将其更改为以下内容将解决此问题:

if (check_similar(a, b))

您必须在check_中传递数组,就像它一样

check_similar(a,b);

您必须在check_中传递数组,就像它一样

check_similar(a,b);
由于数组作为参数传递给函数时,默认情况下会衰减为指向第一个元素的指针:

除非它是sizeof运算符的操作数,或一元&运算符,或是用于初始化数组的字符串文字,否则类型为array的表达式将转换为类型指针指向类型的表达式,该类型指针指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义

资料来源:C18,§6.3.2.1/3

对该指针使用&运算符将获得一个int*[5]类型的指针,但选中它将int*作为参数

这就是指针不匹配,即所指的不兼容指针错误

只需省略&s:

一切都很好

由于数组作为参数传递给函数时,默认情况下会衰减为指向第一个元素的指针:

除非它是sizeof运算符的操作数,或一元&运算符,或是用于初始化数组的字符串文字,否则类型为array的表达式将转换为类型指针指向类型的表达式,该类型指针指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义

资料来源:C18,§6.3.2.1/3

对该指针使用&运算符将获得一个int*[5]类型的指针,但选中它将int*作为参数

这就是指针不匹配,即所指的不兼容指针错误

只需省略&s:


一切正常。

a和b分别是指向a[0]和b[0]的指针。因此,&a和&b分别是指向a[0]和b[0]的指针。

a和b分别是指向a[0]和b[0]的指针。因此,&a和&b分别是指向a[0]和b[0]的指针。

只需传递a和b,而不是&a和&b。a和b将从数组自动衰减到指针。只需传递a和b,而不是&a和&b。a和b将从数组自动衰减到指针。