c++ - 将变量作为指针、引用、常量引用等传递 : What Happens at the Hardware Level?

标签 c++ pointers

我想了解当使用不同的方法将变量传递给函数时实际发生了什么。请批评我的理解并在必要时纠正我。

我理解的第一件事是“传入变量”只是一个表达式。函数是存储在某个内存位置的代码块,调用函数就是调用该代码块的执行。关于“传入变量”“返回变量”的所有内容对于编程初学者来说只是一种抽象。

大多数高级语言只有函数的按值传递。 (但是,有一些 hack 可以实现引用传递行为,并且在任何情况下编译器都会做它想做的任何事,所以你不能假设你知道会发生什么。)

C++ 是一种低级和高级语言的混合体。它就像一种高级语言,您可以随时在其中覆盖高级行为。

这是按值传递的工作方式:

void foo(int a)
{
    std::cout << a;
}

int main()
{
    int a = 3;
    foo(a);
    return 0;
}

相同
int main()
{
    int a = 3;
    // ---- this is the function executing -----
    int temp = a;
    std::cout << temp;
    // -----------------------------------------
    return 0;
}

这是按引用传递的工作方式:

void foo(int& a)
{
    std::cout << a;
}

int main()
{
    int a = 3;
    foo(a);
    return 0;
}

相同
void foo(int& a)
{
    std::cout << a;
}

int main()
{
    int a = 3;
    // ---- this is the function executing -----
    std::cout << a;
    // -----------------------------------------
    return 0;
}

这是指针传递的工作方式:

void foo(int* a)
{
    std::cout << a;
}

int main()
{
    int a = 3;
    foo(&a);
    return 0;
}

相同
void foo(int* a)
{
    std::cout << *a;
}

int main()
{
    int a = 3;
    // ---- this is the function executing -----
    int* temp = &a;
    std::cout << *temp;
    // -----------------------------------------
    return 0;
}

换句话说,这与按值传递是一样的,只是值是一个指针。

那么,在 C++ 中经常看到的 const & 参数呢?那到底是做什么的?嗯,没什么特别的。

void foo(const int& a)
{
    std::cout << a;
}

完全一样
void foo(int& a)
{
    std::cout << a;
}

const只是你和编译器之间的约定,你不会在函数执行过程中改变a的值。

如果将引用传递给指针会怎样?

void foo(int*& a)
{
    std::cout << *a;
}

相同
void foo(int& a)
{
    std::cout << a;
}

除了效率低下,因为你必须取消引用。

我说的对吗????

最佳答案

  • 所有函数参数/结果值都通过它们的表示形式传递(一个值(整数/ float )、一个指针或一个引用(不考虑转换))
  • 任何表示都可以直接传递给 CPU 寄存器
  • 指针和引用本质上是相同的,都反射(reflect)了一个内存地址,其中指针可以修改为指向不同的地址,引用可以修改(由于 C++ 功能)以在内存中保存不同的值它指向的地址(同样:将转换放在一边)。

(希望对您有所帮助)

关于c++ - 将变量作为指针、引用、常量引用等传递 : What Happens at the Hardware Level?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23394257/

相关文章:

c++ - 为什么为派生类定义拷贝构造函数要求定义基类的默认构造函数?

C++ 通过指针访问二维数组中的连续值

c - 指向不同结构实例的结构指针

c++ - 描述原始指针(指向对象)的概念的正确实现是什么?

c++ - 私有(private)变量的读取时间晚于成员初始化列表?

c++ - 如何阻止内存泄漏?

c++ - 如何将模板类型限制为基类而不包括该基类的子类?

c++ - 监控 C++11 和 C++03 中的类实现?

c++ - 将具有非 const 元素的 shared_ptr vector 转换为具有 const 元素的 shared_ptr vector

c - 指向二维数组的指针在底层是如何工作的?