当人们想操作函数中的指针时,为什么要传入双指针
When people want to manipulate a pointer in a function, why do they pass in a double pointer?
在查看代码时,我注意到当人们想要操作指针时,会向函数传递一个指针对一个指针。
示例:我看到类似的东西
void increment_if_J (char ** ptr)
{
if (**ptr == 'J')
++(*ptr);
}
但是,传入对指针的引用不是更有意义吗?
void increment_if_J (char * & ptr)
{
if (*ptr == 'J')
++(ptr);
}
这样,你就不会创建额外的变量,也不必因为思考令人困惑的"点对点"逻辑而破坏你的大脑。
您用[c]
和[c++]
标记了问题。
-
在C中,答案很简单:没有引用,所以第二种方法不是一种选择。
-
在C++中,两者都是有效的,并且在很大程度上都是一种风格选择。有些人可能会觉得第一个会在调用站点上更清楚地表明指针可能会被函数修改。有些人可能更喜欢第一个,因为他们习惯于用C编码。有些人可能喜欢第二个,因为你引用的原因。等等…
因为传递的每个C参数都是按值调用的。这在C++中是不同的,它有引用。
尽管由于与预先存在的C API代码(无引用)的兼容性原因,大多数情况下使用双指针传递,但在某些情况下(除了编码风格),函数可能更喜欢直接修改其参数,而不是分配额外的堆栈本地参数:
void increment_if_J(char ** ptr)
{
// I can use ptr to do some other processing first
char** original = ptr;
char other_str[] = "Jenny";
char* contrivedptr = other_str;
ptr = &contrivedptr;
**ptr = 'F'; // other_str is now "Fenny"
ptr = original;
if (**ptr == 'J')
++(*ptr);
}
void increment_if_J_ref(char * & ptr)
{
// Can't directly use ptr without modifying the referred memory
if (*ptr == 'J')
++(ptr);
}
int main(){
char str[] = "Jerry";
char* ptr = str;
increment_if_J(&ptr); // ptr points to "erry"
ptr = str;
increment_if_J_ref(ptr); // ptr points to "erry"
return 0;
}
这不是一种"促进做作"的技术,但在特殊的内存限制情况下可能会派上用场。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么++(*p)更改指针值
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么指针不写入类的地址?
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么要增加导致崩溃的指针
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 共享指针:为什么没有双免费
- 指向2D数组的指针(为什么起作用)
- 函数指针 - 为什么,什么时候我可以没有
- C++ 函数指针 -- 为什么会这样
- 不支持在c或c++中添加两个指针.为什么?
- 无效的指针-为什么
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么
- 在信号代码中将整数转换为函数指针-为什么这样做?
- 指向结构体作为函数参数的指针-为什么不更新其值