我读了一本书,它给出了.h文件的例子,它等于java中的队列接口:
void InitQueue(Queue* pQueue, int iSize);
bool Insert(Queue* pQueue, const Item* pItem);
bool Extract(Queue* pQueue, Item** pItem);
bool GetFirst(const Queue* pQueue, Item** pItem);
bool IsFull(const Queue* pQueue);
bool IsEmpty(const Queue* pQueue);
我不明白两件事:
Extract, GetFirst
中第二个参数属于Item**
而不是Item*
?什么是我们这样的事情的意思?IsFull, IsEmpty
,..)中我们得到参数const Queue*
而不仅仅是Queue*
?答案 0 :(得分:3)
IsFull()和IsEmpty()接受const参数,因为它意味着它们不会更改Queue对象;它是不变的,不会被修改。
Extract和GetFirst使用**因为:
int a; // Declares an int
a = 2; // Sets a to 2
int *b = &a; // Declares a pointer pointing to that int
*b = 4; // Sets a to 4
int **c = &b; // Declares a pointer pointing to that pointer to that int
**c = 6; // Sets a to 6
如果我将c传递给函数:
int global_var;
int main() {
modify_ptr(c);
}
void modify_ptr(int **ptr)
{
*ptr = &global_var;
}
我刚刚传入的指针本身已被修改; ** c现在指向global_var而不是。
你将这些指针传递给getfirst和extract的原因是因为那些是" getter"函数 - 您希望它们返回指向数据的指针。所以他们需要能够返回一个指针,这些方法就是将一个指针传递给指针,就像上面的例子一样,这样他们就可以修改你传递它们指向正确元素的内容。
答案 1 :(得分:2)
为什么在Extract
,GetFirst
第二个参数的类型为Item**
,而不是Item*
?我们写这样的东西是什么意思?
这样可以在函数内部更改指针
最有可能的是,这意味着Item
指针将由调用者传递,但将在函数内部分配。你不能通过按值传递指针来实现这一点,因为这会将内存分配给指针的副本而不是传递的原始指针。
很难说为什么程序员使用调用者的这种语义传递指针和函数来分配它。理想情况下,人们会期待一个源宿机制。
为什么在某些函数(IsFull
,IsEmpty
,...)中我们得到的是参数const Queue*
而不仅仅是Queue*
?
const correctness !
它向函数的用户指示在函数内部不会改变指向的数据。
答案 2 :(得分:1)
为什么在Extract中,GetFirst第二个参数是Item **类型而不是Item *?什么是我们这样的事情是什么意思?
这些是产出。队列显然包含一堆指向项目的指针。因为它是一个指针,我会让Extract
和GetFirst
只取一个参数并返回一个指针。空指针表示失败。开发人员没有这样做。相反,他们使用旧的C风格范式。为什么?谁知道。这不是写这些的最好方法。
为什么在某些函数(IsFull,IsEmpty,..)中我们得到的参数为const Queue *而不仅仅是Queue *?
将参数标记为const
告诉用户代码该函数不会对参数的内容做任何事情。将这样的未受干扰的引用和指针参数标记为const
是一种很好的编程实践。