&引用;指针应为“;及;冲突参数类型“;C中的错误

&引用;指针应为“;及;冲突参数类型“;C中的错误,c,pointers,compiler-errors,C,Pointers,Compiler Errors,因此,我编写了一个插入队列的函数,即en_queue。职能机构是: void en_queue(queue,max,front,rear) { int ch1; printf("\n Enter element to add->"); scanf("%d",&ch1); if(front==0 && rear==(max-1)) { printf("\n Caution!! Queue Overflow!!"

因此,我编写了一个插入队列的函数,即
en_queue
。职能机构是:

void en_queue(queue,max,front,rear) 
{
    int ch1;
    printf("\n Enter element to add->");
    scanf("%d",&ch1);
    if(front==0 && rear==(max-1))
    {
        printf("\n Caution!! Queue Overflow!!");
    }
    else if(rear==(max-1) && front>0)
    {
        rear=0;
        *queue[rear]=ch1;
    }
    else if(front==-1 && rear==-1)
    {
        front=rear=0;
        *queue[rear]=0;
    }
    else 
    {
        rear++;
        *queue[rear]=ch1;
    }
}
原型声明是:

void en_queue(int *,int, int, int);
在打电话的时候,我这样说:

en_queue(queue,MAX,front,rear);
其中,
queue[MAX]
是一个数组(
#define MAX 10
),
MAX
是数组可以包含的元素数,
front
reast
都是当前值为
-1
的整数。我收到重复出现的
类型错误:指针应为
,函数'en_queue'的
参数声明冲突。


我不明白为什么参数不匹配。因为我传递了数组的地址,并在指针变量中接收它,然后使用指针。那么怎么会有错误呢?

如果
队列
int*
,那么作为“数组”访问它的正确方法是

而非
*队列[索引]

队列[索引]
实际上是
*(队列+索引)

如果你做了
*队列[索引]
你实际上是在做
*(*(队列+索引))

(队列+索引)
将到达地址位置
索引
远离
队列
中存储的地址的位置<代码>*(队列+索引)
将通过获取存储在地址中的值来解除对它的引用<代码>*(*(队列+索引))
将使用获取的值作为地址,并尝试进行另一次获取,这是错误的,因为现在您取消引用整数。

首先:

void en_queue(queue,max,front,rear) 
{
应该是:

void en_queue(int *queue, int max, int front, int rear) 
{
第二,像
*queue[rear]=0这样的表达式应该正好
队列[后方]=0队列
int*

注意:表达式
a[i]
==
*(a+i)
,因此如果
a
是指针,那么在表达式
a[i]
中,您不需要显式遵从
*

在表达式
*queue[rear]
中,您得到了错误
类型错误:应为指针
,因为您取消引用了两次,例如
*queue[rear]
==
*(queue+rear)
,因为
*(queue+rear)
不是指针,而是int,因此编译器消息需要一个指针


编译器消息:“函数
en_queue()
”的参数声明冲突,因为第一个参数是
int*
。在函数定义中,您不指定参数的类型,默认值被视为int类型

您说过:
。其中queue[MAX]是一个数组。

您的声明是:
void en_queue(int*,int,int,int)

那么这意味着什么:
*队列[后部]=ch1

您正在尝试取消对整数的引用

将上述程序中的所有实例更正为:
queue[rear]=ch1

虽然可以编写声明而不命名参数,只提供类型说明符,但不能编写仅包含名称且不包含说明符的定义。
冲突的参数声明
错误就是因为这样,因为编译器将定义中的参数名称解释为类型而不是名称。想想看,编译器怎么知道没有类型的名称和没有名称的类型之间的区别呢

正如@grijesh所写,您应该将您的定义写为:

void en_queue(int *queue, int max, int front, int rear)
相反

另一个问题是,您正在取消对指针的引用两次,这对于指向整数的指针是没有意义的。数组和指针的相似之处在于,它们提供了一个内存地址,您可以使用该地址进行进一步的索引。这可以通过使用常规索引运算符来完成:

queue[index]
或者使用显式指针解引用运算符
*
,以及如下所示的指针算法:

*(queue + index)

阅读有关指针算法的更多信息。

这是您的问题:
*队列[后部]
为什么<代码>队列
的类型为
int*
无需取消对其的引用。卸下
*
。另外,您得到的错误似乎表明您为第一个参数传递了
int**
type,但是函数被定义为接受
int*
这与我的想法相同。当函数已正确声明时,定义这样的函数是否可以
void en_queue(queue,max,front,reast)
。@nishant否我们还需要在函数定义中指定,因为默认值是int,其中第一个参数是
int*
@nishant检查此项并
*(queue + index)