C++ ptr**和ptr*&;之间是否存在差异或首选;在C++;调用函数的时候?
改变函数中的指针有什么不同或首选的方法吗?以这个片段为例C++ ptr**和ptr*&;之间是否存在差异或首选;在C++;调用函数的时候?,c++,pointers,C++,Pointers,改变函数中的指针有什么不同或首选的方法吗?以这个片段为例 void change(int** ptr) { **ptr = 50; *ptr = nullptr; } void change(int*& ptr) { *ptr = 50; ptr = nullptr; } int main() { int a = 5; int* ptr =
void change(int** ptr) {
**ptr = 50;
*ptr = nullptr;
}
void change(int*& ptr) {
*ptr = 50;
ptr = nullptr;
}
int main()
{
int a = 5;
int* ptr = &a;
int** ptr2 = &ptr;
std::cout << "value: " << a << std::endl;
std::cout << "value: " << ptr << std::endl;
std::cout << "value: " << ptr2 << std::endl;
change(ptr2);
//change(ptr);
std::cout << "value: " << a << std::endl;
std::cout << "value: " << ptr << std::endl;
std::cout << "value: " << ptr2 << std::endl;
system("pause");
}
void变更(int**ptr){
**ptr=50;
*ptr=nullptr;
}
无效更改(int*&ptr){
*ptr=50;
ptr=nullptr;
}
int main()
{
INTA=5;
int*ptr=&a;
int**ptr2=&ptr;
这在很大程度上是个人品味的问题
也就是说,当调用void change(int**ptr)
时,由于您倾向于使用&
传递某物的地址,因此在调用站点上,“某物”的可以由函数修改。如果使用int*&ptr
重载,则调用语法与按值传递和按引用传递完全相同,因此不太清楚
除上述内容外,如果允许nullptr
,我倾向于使用指针作为函数参数,如果不允许,则使用引用。可以使用空指针,但不能使用空引用
您可以为第一个提供nullptr
,它将被编译1,因为存在从std::nullptr\u t
到int**
的隐式转换。如果您尝试为第二个提供nullptr
,它将失败。最好的匹配是将std::nullptr\u t
转换为int*
,但您不能t将可变引用绑定到临时引用
我讨论了不同参数传递方式的各种情况,其中还包括对象所有权方面的考虑(使用std::unique\u ptr
)
1.该行为将是未定义的,因为您取消了对它的引用
ptr**和ptr*&…之间有区别吗
是的。前者是指向ptr*
类型对象的指针,而后者是指向ptr*
类型对象的引用
或者更喜欢
void change(int** ptr) {
**ptr = 50;
*ptr = nullptr;
}
void change(int*& ptr) {
*ptr = 50;
ptr = nullptr;
}
参考书的优点
您会发现引用是隐式间接的,这使得语法更简单,并且通常有助于可读性。这在引用/指针指向指针的情况下尤为重要。获取引用也有同样的优点:不需要使用运算符的地址
另一个优点是引用不能被重新分配来引用另一个对象。这使得读取使用引用的程序更加简单,因为您不需要知道引用是否在长算法中被重新分配;您知道它不是
另一个优点是引用不能为null。因此,您不需要在函数中检查这种可能性。如果将null传递给第一个示例函数,则行为将是未定义的,这是一件非常糟糕的事情
参考书的缺点
您会发现引用是隐式间接的,这可能会让只熟悉值类型的人(C程序员)感到困惑
另一个缺点是无法重新分配引用以引用另一个对象。这对函数来说似乎不是问题,因为您不需要引用多个对象,但一般来说,在某些情况下它会很有用
另一个缺点是引用不能为null。这似乎对您的函数来说不是问题,您的函数可能从未打算处理这种情况。但一般来说,在某些情况下,您希望表示对不存在对象的引用关系
偏好是个人的,但在我看来,参考的优点大于缺点,除非您需要一个不可能的特性(可空性、重新分配)指针函数指针不复制<代码> PTR>代码>。在C++中,最好不要使用原始的Posits,性能没有差别,引用是指针中的指针。end@user2176127“仿佛”规则将是一个更好的引用,因为在性能上没有差异。引用不必实现为指针,指针有时可以“取消引用”由编译器命名一个类型;ptr**
是指向该类型的指针,ptr*&
是对该类型的引用。这个问题与询问int*
和int&
之间的区别完全相同。