Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对队列类型使用指针_C_Pointers_Queue - Fatal编程技术网

C 对队列类型使用指针

C 对队列类型使用指针,c,pointers,queue,C,Pointers,Queue,我对c和指针非常陌生。每次我理解它的时候,都会出现一个我并不真正理解的问题(我花了一些时间阅读c文档,但指针对我来说仍然不清楚): 我希望我的问题不会太模糊,但有人能解释一下在排队函数中指针的用法吗?我认为排队的原理是分配一些精确的连续内存地址,但这不是肯定的….enqueue接受一个队列(队列类型的队列)并在其中添加一个元素(由整数组成) queue*q是一个指针,因为 可能有多个队列,参数告诉我们正在谈论的队列 为了避免全局变量,队列作为参数给出-我们需要一个对队列的引用,以便对其进行修改

我对c和指针非常陌生。每次我理解它的时候,都会出现一个我并不真正理解的问题(我花了一些时间阅读c文档,但指针对我来说仍然不清楚):


我希望我的问题不会太模糊,但有人能解释一下在排队函数中指针的用法吗?我认为排队的原理是分配一些精确的连续内存地址,但这不是肯定的….

enqueue
接受一个队列(队列类型的队列)并在其中添加一个元素(由整数组成)

queue*q
是一个指针,因为

  • 可能有多个队列,参数告诉我们正在谈论的队列
  • 为了避免全局变量,队列作为参数给出-我们需要一个对队列的引用,以便对其进行修改,即使退出
    enqueue
按值传递队列,如

enqueue(queue q, int x) { ...
意味着

  • 大量数据作为参数提供(将队列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回答,他建议更好的队列实现)

enqueue
获取队列(队列类型的队列)并在其中添加元素(由整数组成)

queue*q
是一个指针,因为

  • 可能有多个队列,参数告诉我们正在谈论的队列
  • 为了避免全局变量,队列作为参数给出-我们需要一个对队列的引用,以便对其进行修改,即使退出
    enqueue
按值传递队列,如

enqueue(queue q, int x) { ...
意味着

  • 大量数据作为参数提供(将队列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回答,他建议更好的队列实现)


有几点:

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

有几点:

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

问题出在哪里?您有错误吗?什么不起作用?请准确,这样您就可以节省我们猜测的时间:)@m0skit0:让我给你强调一下:有人能解释一下
排队
函数中指针的用法吗?@AlokSave解释一下什么?指针是如何工作的?我不明白他到底想知道什么…@m0skit0代码确实在工作(用于遍历图),但我不明白将指针作为变量而不是简单变量(enqueue(queue q,int x))传递有什么好处?1)您不需要
last
元素,只需要first+count。2) 对于大小、计数和索引,最好使用无符号类型(您不希望使用负索引或大小)。问题是什么?你有错误吗?什么不起作用?请准确一点,这样我们就不用猜测了:)@m0skit0:让我给你强调一下:有人能解释一下
排队
函数中指针的用法吗?@AlokSave解释一下什么?指针是如何工作的?我不明白他到底想知道什么…@m0skit0代码确实在工作(用于遍历图形),但我不明白将指针作为变量而不是简单变量传递有什么好处(enqueue(queue q,int x))?1)您不需要
last
元素,只需要first+count。2) 最好对大小、计数和索引使用无符号类型(您不需要负索引或大小)