2

所以,我写了一个插入队列的函数,即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是数组可以包含的元素数,两者frontrear都是具有当前值的整数-1。我得到重复的错误type error: pointer expectedConflicting argument declarations for function 'en_queue'.

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

4

4 回答 4

3

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

queue[index];

不是 *queue[index]

queue[index]实际上是*(queue + index)

如果你这样做,*queue[index]你实际上是在做*(*(queue + index))

(queue + index)将获得index远离存储在 中的地址的地址位置位置queue*(queue + index)将通过获取存储在地址中的值来取消引用它。*(*(queue + index))将使用获取的值作为地址并尝试进行另一个获取,这是错误的,因为现在您取消引用一个整数。

于 2013-09-13T04:45:11.277 回答
3

第一的:

void en_queue(queue,max,front,rear) 
{

应该:

void en_queue(int *queue, int max, int front, int rear) 
{

其次,表达式 like*queue[rear] = 0;应该只是queue[rear] = 0;因为queueis int*

注意:表达式a[i]== *(a + i),所以如果a是指针,那么在表达式中a[i]你不需要*显式地尊重。

在您的表达式*queue[rear]中,您收到错误type error: pointer expected,因为您取消引用两次,例如*queue[rear]==* *(queue + rear)因为*(queue + rear)不是指针而是一个 int 因此编译器消息需要一个指针。

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

于 2013-09-13T04:45:33.550 回答
2

虽然您可以在不命名参数的情况下编写声明,只给出类型说明符,但您不能编写只有名称而没有说明符的定义。conflicting argument declarations错误是因为这个,因为编译器将定义中的参数名称解​​释为类型而不是名称。想一想,编译器怎么知道没有类型的名字和没有名字的类型之间的区别?

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

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

反而。

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

queue[index]

或使用显式指针取消引用运算符*和指针算术,如下所示:

*(queue + index)

在此处阅读有关指针运算的更多信息。

于 2013-09-13T04:55:28.997 回答
0

你说:..where queue[MAX] is an array..

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

那么这是什么意思:*queue[rear]=ch1;

您正在尝试取消引用整数

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

于 2013-09-13T04:45:35.607 回答