2013-02-03 46 views
0

我对c和指针非常陌生。每次我瘦K I明白了,总会有,我真的不明白(我花了一些时间阅读ç文档,但指针仍然不清楚我)一个问题:使用队列类型指针

typedef struct { 
     int q[QUEUESIZE+1]; 
     int first; 
     int last; 
     int count; 
} queue; 

enqueue(queue *q, int x) 
{ 
    if (q->count >= QUEUESIZE) 
     printf("Warning: queue overflow enqueue x=%d\n",x); 

    else { 
    q->last = (q->last+1) % QUEUESIZE; 
    q->q[ q->last ] = x; 
    q->count = q->count + 1; 
    } 
} 

我希望我的问题会不是太不透明,但可以解释在排队函数中使用指针吗?我认为排队原则是分配一些精确连续的存储器地址,但它不是肯定....

+2

什么问题?你有错误吗?什么不工作?请准确,所以你节省我们的时间猜测:) – m0skit0

+3

@ m0skit0:让我为你突出显示它:***有人可以解释指针在'enqueue'函数中的使用吗?*** –

+0

@AlokSave解释什么?指针如何工作?我不明白他到底想知道什么...... – m0skit0

回答

3

enqueue需要队列队列(类型队列的队列),并在添加元素它(这是由一个整数。

queue *q是一个指针,因为可能

  • 可能有不止一个队列,参数告诉什么排队,我们正在谈论
  • 为了避免一个全局变量,队列给定的参数 - 我们希望在队列的引用,以便它可以被修改,甚至退出enqueue

传递一个队列后的修改将保持活由值,如

enqueue(queue q, int x) { ... 

将意味着

  • 很多
  • 01给定的参数(队列myQueue中的拷贝到 q参数)的数据的
  • q被修改时,在enqueue函数内对q进行修改。 初始提供的队列(myQueue中)作为参数不会被修改

例如

enqueue(queue q, int x) { 
    q.count++; // only the local q.count is changed, not myqueue.count 
    // ... 
} 

// ... 

queue myqueue; 
// ... 
enqueue (myqueue, 3); // enqueue changes its local parameter, myqueue is not affected 

此外,enqueue功能的实现可以优化......(见下文谁提出wildplasser答案一个更好的队列实现)

+0

好了,现在很清楚! – user1611830

1
struct queue { 
     unsigned first; 
     unsigned count; 
     int q[QUEUESIZE]; 
     }; 

int enqueue(struct queue *q, int x) 
{ 
    if (q->count >= QUEUESIZE) { 
     fprintf(stderr, "Warning: queue overflow enqueue x=%d\n", x); 
     return -1; 
     } 

    q->q[ (q->first+q->count++) % QUEUESIZE ] = x; 
    return 0; /* success */ 
} 

的几点:

  • 诊断输出应该去到stderr
  • 使用无符号类型的计数和偏移量将(在大多数情况下),避免数值下溢(或将其转换成溢流,这将失败更快;-)
  • 你不需要三个元素{head,tail,count},只有两个{head,count}就足够了
  • 更少的变量:=更少的分配:=更少的行数=更少的出错机会。
  • 范围检查和模块划分中的QUEUESIZE可能应该替换为sizeof q->q/sizeof q->q[0],它更加健壮。