所以,我编写了一个插入队列的函数viz 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
和rear
都是整数当前值-1
。我遇到了type error: pointer expected
和Conflicting argument declarations for function 'en_queue'.
我看不出为什么参数不匹配。因为我传递了数组的地址并在指针变量中接收它并使用指针。那怎么会有错误?
答案 0 :(得分:3)
如果queue
为int *
,那么以“数组”形式访问它的正确方法是
queue[index];
和不 *queue[index]
queue[index]
实际上是*(queue + index)
。
如果您执行*queue[index]
,那么您实际上正在*(*(queue + index))
。
(queue + index)
将转到距离index
中存储的地址远离的地址位置queue
。 *(queue + index)
将通过获取存储在地址中的值来取消引用它。 *(*(queue + index))
将使用获取的值作为地址并尝试进行另一次获取,这是错误的,因为现在您取消引用整数。
答案 1 :(得分:3)
第一:
void en_queue(queue,max,front,rear)
{
应该是:
void en_queue(int *queue, int max, int front, int rear)
{
其次,像*queue[rear] = 0;
这样的表达式应该只是queue[rear] = 0;
,因为queue
是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类型。
答案 2 :(得分:2)
虽然您可以在不命名参数的情况下编写声明,但只需给出类型说明符,您就不能只使用名称和没有说明符来编写定义。 conflicting argument declarations
错误是因为这样,因为编译器将定义中的参数名称解释为类型而不是名称。想一想,编译器如何知道没有类型的名称和没有名称的类型之间的区别?
正如@grijesh写的那样,你应该把你的定义写成:
void en_queue(int *queue, int max, int front, int rear)
代替。
另一个问题是你将指针解除引用两次,这对指向整数的指针没有意义。数组和指针的相似之处在于它们提供了可用于进一步索引的内存地址。这可以通过使用常规索引运算符来完成:
queue[index]
或使用显式指针解引用运算符*
和指针算术,如下所示:
*(queue + index)
详细了解指针算术here。
答案 3 :(得分:0)
你说:..where queue[MAX] is an array..
您的声明是:void en_queue(int *,int, int, int);
那是什么意思:*queue[rear]=ch1;
您正在尝试取消引用整数
将上述程序中的所有实例修改为:queue[rear] = ch1;