代码之家  ›  专栏  ›  技术社区  ›  Danilo

引用是否在C++中作为null指针传递?复制

  •  0
  • Danilo  · 技术社区  · 2 年前

    tl;博士传递的对函数的引用具有与相同的地址 nullptr 初始化的指针。是否每个引用都被传递为 nullptr ?

    使用 g++ gedit (无IDE)使用标志 -g -Wall -Wextra -Werror 并且正在玩指针游戏。

    我已经编写了一个函数来显示地址,如果指针不是 nullptr 它指向的位置。

    void test_pointer(int *ptr){
        if(ptr == nullptr){
            std::cout<< &ptr << std::endl;
        }else{
            std::cout << '\t' << &ptr << "\t points to\t" << &(*ptr) << '\t' << *ptr << std::endl;
        }
    }
    

    在切入点:

    int main(){
        
        std::cout << "****cake" << std::endl;
        int a = 123;
        int *ptr1=nullptr;
        
        std::cout << "&a\t";
        test_pointer(&a);
        
        std::cout << "ptr\t";
        test_pointer(ptr1);
        
        return 1;
    }
    

    我希望输出是在作用域之后被销毁的本地指针,但正如输出所示 ptr &a 有相同的地址吗?

    &a      0x7ffc89c4aac8   points to  0x7ffc89c4aaec  123
    ptr     0x7ffc89c4aac8
    

    那么,传递给指针参数函数的任何引用都是 nullptr ? 如果是,使用安全吗?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Scheff's Cat    2 年前

    在OP公开的代码中:

    void test_pointer(int *ptr){
        if(ptr == nullptr){
            std::cout<< &ptr << std::endl;
        }else{
            std::cout << '\t' << &ptr << "\t points to\t" << &(*ptr) << '\t' << *ptr << std::endl;
        }
    }
    

    ptr 是一个函数 价值 参数(具有类型 int* )(反对 参考 参数 如果值参数的值在函数内部发生更改,则该值参数可能对调用站点无效。换句话说,必须在函数调用中复制值参数。

    因此,值参数本身就是一个对象,并且有自己的存储空间。这与(在这种情况下)参数包含指针以及它指向的位置无关。

    函数参数的生命周期以函数调用结束。

    TL;DR:对我来说,对于同一函数的两个连续函数调用,同一函数参数的存储使用相同的地址并不奇怪。

    这可能是出于技术原因(在大多数平台上使用堆栈来分配局部变量)。

    FYI: Difference between value parameter and reference parameter?