提问人:SungJin Park 提问时间:2/5/2022 最后编辑:Vlad from MoscowSungJin Park 更新时间:2/5/2022 访问量:934
const C 中的结构参数
const Struct parameter in C
问:
我正在研究简单的二叉树。
我看到了一个模型答案,并有一个问题。
在此代码中,并且是结构体。Item
Tree
typedef struct {
char characters[20];
char name[20];
} Item;
typedef struct node {
Item item;
struct node* left;
struct node* right;
} Node;
typedef struct tree {
Node* root;
int size;
} Tree;
我将展示两个函数原型。
bool InTree(const Item* pi, const Tree* ptree);
Item* TreeSearch(Tree* ptree, const Item key);
一个是使用 Item*,另一个是使用 Item by parameter。我知道每个意味着什么。但是当使用时,我认为这两者之间没有区别。如果我们假设内存足够大。const
const Item* pi
当用作函数的参数时,哪个更好?
是关于编码风格问题还是有意为之?const Item key
答:
/* 1 */ void foo(Item *pi)
/* 2 */ void foo(const Item *pi)
/* 3 */ void foo(const Item * const pi)
这三者都会将引用传递给结构,而不是结构本身。区别在于:
- 可以修改指针和引用的结构
pi
- 指针可以修改,引用的结构不能修改
pi
- 无法修改指针和引用的结构
pi
/* 1 */ void foo(Item pi)
/* 2 */ void foo(const Item pi)
在这两种情况下,struct 都将按值复制,即整个结构将被传递给函数。如果修改成员,则不会影响原始结构。
- 结构可以修改
pi
- 结构体无法修改
pi
评论
const Item pi
在这两种使用说明符声明参数的方法之间Item
bool InTree(const Item* pi, const Tree* ptree);
Item* TreeSearch(Tree* ptree, const Item key);
与声明相比,声明参数 like 的方法更可取,因为在第二种情况下,复制包含字符数组的结构类型的整个对象,而不是只处理指向更有效的对象的指针。const Item* pi
const Item key
const Item *pi
表示 or (或 ) 无法修改。*pi
*(pi + index)
pi[index]
const Item key
表示无法修改(在变量的情况下在初始化后,或者在函数参数的情况下作为函数调用的一部分进行赋值后)。key
bool InTree(const Item* pi, const Tree* ptree);
我猜会搜索指向 的特定节点是否存在于根节点指向 的树中。(即,它正在搜索指向特定事物的指针,而不是搜索匹配项。无需修改树中的 any 或指向的 by ,因此这两个参数都可以是 type 来指示函数不会修改任何内容。InTree
Item
pi
ptree
Item
Item
Item
Item
pi
const Item *
Item* TreeSearch(Tree* ptree, const Item key);
我猜会搜索根节点指向的树以找到与 匹配的节点。我猜只有 的“值”部分会与树中的节点进行比较,而 的“链接”部分将被忽略。我猜如果找到一个,该函数将返回指向树中匹配节点的指针,否则它将返回一个空指针。TreeSearch
ptree
Item key
Item
Item
Item
将参数声明为是编码样式问题。它对函数的调用者没有区别,因为参数是按值传递的。它只会在函数定义中产生影响,防止函数体修改参数的值。key
const Item key
我想该参数可以声明为假设该函数不修改 .ptree
const Tree *
*ptree
我猜函数返回类型不是因为函数的调用者可能想要以某种方式修改(间接)返回的。Item *
const Item *
Item
顺便说一句,即使函数定义为TreeSearch
Item* TreeSearch(Tree* ptree, const Item key)
{
/* ... implementation omitted ... */
}
然后它将匹配此声明,而不带限定符const
Item* TreeSearch(Tree* ptree, Item key);
因此,参数的限定符在函数的声明中确实是多余的,即使它在函数的定义中不是多余的。const
key
这不适用于函数的声明。InTree
对于 ,如果类型被认为是“大”的,那么将参数更改为 以减少函数调用开销会更实用。程序员应该对此做出最佳判断。然后,该函数将被定义为在树中查找匹配的节点(仅考虑 的“值”部分并忽略 “链接”部分),而不是查找 指向的特定节点。Item* TreeSearch(Tree* ptree, const Item key);
Item
key
const Item *key
Item
*key
Item
Item
key
评论
structs
const
Item key
const Item key