为什么我们需要&在两个都采用指针类型参数时调用函数时在某个地方而不是在另一个地方?

时间:2016-12-18 08:11:46

标签: c pointers data-structures queue function-pointers

    #include <stdio.h>
    #include <stdlib.h>
    #define QUEUESIZE 30

    int qfull(int *r)
    {
        if(*r == QUEUESIZE-1)
            return 1;
        else
            return 0;
    }


    int qempty(int *f,int *r)
    {
        if(*f > *r)
            return 1;
        else
            return 0;
    }

    void enqueue(int item,int q[], int *r)
    {
        if(qfull(r))
        {
            printf("Cannot Insert. Queue full.\n");
            return;
        }

        (*r)++;
        q[*r] = item;
    }

    void dequeue(int q[], int *r, int *f)
    {
        if(qempty(f,r))
        {
            printf("The queue is empty\n");
            return;
        }

        int item_deleted = q[*f];
        (*f)++;

        if(*f > *r)
        {
            *f = 0;
            *r = -1;
        }
    }

    void display(int q[], int *f, int *r)
    {
        if(qempty(f,r))
        {
            printf("Nothing to display.\n");
            return;
        }

        for(int i=*f; i<=(*r); i++)
        {
            printf("%d\n",q[i]);
        }
    }

    int main()
    {
        int f = 0;
        int r = -1;

        int q[QUEUESIZE];

        int item,choice;

        while(1)
        {
            printf("Enter a choice: \n");
            printf("1. Enqueue\n");
            printf("2. Dequeue\n");
            printf("3. Display\n");
            printf("4. Exit\n");

            scanf("%d",&choice);

            switch(choice)
            {
                    case 1:
                    printf("Enter an item: \n");
                    scanf("%d",&item);
                    enqueue(item,q,&r);
                    break;

                    case 2:
                    dequeue(q,&r,&f);
                    break;

                    case 3:
                    display(q,&f,&r);
                    break;

                    default: exit(0);
            }
        }   
    }

这是我的代码。 当我在主程序中调用enqueue函数时,我使用r而不是&amp; r,它给了我一个warning

当我在enqueue的定义中调用qfull()函数时,它取得了&amp; r,它给了我warning

我想知道为什么?

1 个答案:

答案 0 :(得分:-1)

  

当我在主程序中调用enqueue函数时

int main()
{
    ...
    int r = -1;
      ...
      enqueue(item,q,&r)

  

在enqueue

的定义中调用qfull()函数
void enqueue(int item,int q[], int *r)
{
    if(qfull(r))

int rint * r未定义相同的r

前者是int,后者是指向int的指针。