c++引用做函数参数和指针做函数参数的区别

在C++中,引用(reference)和指针(pointer)都可以作为函数的参数类型,但它们之间有一些关键的区别。

1. 语法表示:
   - 引用作为函数参数时,使用`&`符号表示。例如:`void foo(int& x);`
   - 指针作为函数参数时,使用`*`符号表示。例如:`void bar(int* x);`

2. 空值(Null value):
   - 引用不能有空值。在函数参数中使用引用时,必须传递一个有效的对象。
   - 指针可以具有空值。在函数参数中使用指针时,可以将指针设置为`nullptr`或空指针。

3. 初始化要求:
   - 引用在声明时必须进行初始化,并且不能更改引用的目标。一旦引用被初始化,它将一直引用相同的对象。
   - 指针在声明时可以不进行初始化,或者可以使用`nullptr`进行初始化。指针的目标可以在运行时更改,可以将其指向其他对象。

4. 语义:
   - 引用提供了一种对传递的对象的别名引用的方式。函数内部对引用的修改会反映到原始对象上。
   - 指针允许直接访问对象的地址。对指针的修改不会自动反映到原始对象上,需要通过解引用操作符`*`来访问和修改指针指向的对象。

5. 空间占用:
   - 引用不占用额外的内存空间,它只是一个别名。
   - 指针需要占用额外的内存空间来存储指针的地址。

6. 空指针检查:
   - 使用指针作为函数参数时,需要在函数内部进行空指针检查,以确保指针是有效的,以避免访问空指针而导致程序崩溃。
   - 使用引用作为函数参数时,不需要进行空指针检查,因为引用必须在初始化时指向有效的对象。

选择使用引用还是指针作为函数参数取决于具体的情况和需求。通常情况下,如果需要修改传递的对象或者对象可能为空,可以使用指针;如果不需要修改传递的对象,并且对象不能为空,可以使用引用。

答案摘自chatgpt的回答。

因为自己有时候总是弄混,搞懵,就去查了一下。。

更新一下,引用作为函数参数的时候是可以更改传入对象的状态,但不能更改引用对象本身,也就是说不能直接修改传递的对象引用,也就是说你不能将传递的对象引用指向一个完全不同的对象。无论是传值调用还是传引用调用,只能在函数内部对传递的对象引用进行操作,而不能改变传递的对象引用本身。

但是指针是可以的,

通过指针,可以获取传递对象的内存地址,然后通过修改指针的值来改变对象引用的目标。意味着可以在函数内部将指针指向不同的对象,并且这个修改将在函数调用之后反映在原始对象的引用上。

示例:

void changeReference(int** ptr) {
    int* newObject = new int(42);
    *ptr = newObject;
}

int main() {
    int* object = new int(10);
    changeReference(&object);
    cout << *object << endl;  // 输出 42

    delete object;  // 需要释放动态分配的内存
    return 0;
}

示例中,changeReference函数接受一个指向指针的指针作为参数。在函数内部,通过创建一个新的对象,并将指针指向这个新对象,从而改变了原始对象的引用。

总之,通过指针可以改变传递的对象引用的目标,使其指向一个完全不同的对象。这是指针的一项功能,但在使用指针时要注意正确的内存管理。

你可能感兴趣的:(c++)