Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按引用传递和按地址传递之间的差异 int func(int a、int&b){ if(a 引用不能为null ptr,允许为静态_强制转换提供稍高性能的代码(当您碰巧实现它时,它是未定义的行为) 引用没有固定的内存占用,实际上它和指针是一样的,但是,您不能依赖它 引用不能重新分配,只能更改它指向的内容 引用与C不兼容_C++_Parameter Passing_Pass By Reference - Fatal编程技术网

C++ 按引用传递和按地址传递之间的差异 int func(int a、int&b){ if(a 引用不能为null ptr,允许为静态_强制转换提供稍高性能的代码(当您碰巧实现它时,它是未定义的行为) 引用没有固定的内存占用,实际上它和指针是一样的,但是,您不能依赖它 引用不能重新分配,只能更改它指向的内容 引用与C不兼容

C++ 按引用传递和按地址传递之间的差异 int func(int a、int&b){ if(a 引用不能为null ptr,允许为静态_强制转换提供稍高性能的代码(当您碰巧实现它时,它是未定义的行为) 引用没有固定的内存占用,实际上它和指针是一样的,但是,您不能依赖它 引用不能重新分配,只能更改它指向的内容 引用与C不兼容,c++,parameter-passing,pass-by-reference,C++,Parameter Passing,Pass By Reference,我认为这里的b是通过指针传递的,这与通过引用传递是一样的。什么是按地址传递,它与按引用传递有何不同?上面的变量是通过地址传递的吗?还有,为什么func(40,0)给了我一个错误作为输出?实际上,通过引用传递和通过指针传递没有太大区别。一些编译器喜欢MSVC模型引用与此完全相同 然而,在查看细节时,它包含一些令人惊讶的元素: 引用看起来像正则变量,所以不需要到处都使用*或-> 引用不能为null ptr,允许为静态_强制转换提供稍高性能的代码(当您碰巧实现它时,它是未定义的行为) 引用没有固定的

我认为这里的b是通过指针传递的,这与通过引用传递是一样的。什么是按地址传递,它与按引用传递有何不同?上面的变量是通过地址传递的吗?还有,为什么func(40,0)给了我一个错误作为输出?

实际上,通过引用传递和通过指针传递没有太大区别。一些编译器喜欢MSVC模型引用与此完全相同

然而,在查看细节时,它包含一些令人惊讶的元素:

  • 引用看起来像正则变量,所以不需要到处都使用*或->
  • 引用不能为null ptr,允许为静态_强制转换提供稍高性能的代码(当您碰巧实现它时,它是未定义的行为)
  • 引用没有固定的内存占用,实际上它和指针是一样的,但是,您不能依赖它
  • 引用不能重新分配,只能更改它指向的内容
  • 引用与C不兼容
通常,您可以将引用视为指针的特殊情况(反之亦然)。
就我个人而言,我尽可能地使用引用,只有在需要的时候才使用指针。

让我试着让您以简单的方式理解。当你在C++程序中声明任何变量时,编译器在符号表中为该变量创建一个条目,然后为它提供一个适当的内存空间。 在引用变量的情况下,符号表中将有一个新条目,该条目具有与引用变量相同的存储空间,以后将不会为其分配空间,它只是一个别名,就像您可能被两个名称(如名称、昵称)引用一样。 现在让我们看一个指针变量的例子。它是一个指针,但它是一个变量,因此它也将有一个符号表条目,稍后将为其分配空间

因此,从上面的语句中,您可以很容易地找到以下地址(指针)和引用变量之间的差异 1) 不会为引用变量分配额外内存,但指针变量将有4或8个字节,具体取决于要编译和运行代码的系统(32或64位操作系统)。 2) 您以后通常不能遵从引用变量,因此无法更改引用,但对于指针变量,它可以包含不同的指针

同样适用于按引用传递和按地址传递。希望它能帮助你更好地理解

尝试执行下面的代码,您会发现变量和引用变量的地址是相同的

int func(int a, int& b){
   if (a < 3){
       return b;
   } else{
       b++;
       return func( a/10, b);
   }
}

请只问1个有问题的问题。对于后一个问题:通过指针传递与通过引用传递相同,可以有类似的结果,但相差很远。传递指针的可能重复意味着可能传递空指针(指向不存在对象的指针)。通过引用传递参数意味着被调用函数(以及编译器)可以安全地假定传递了有效的对象。如果调用方没有引入未定义的行为(例如,通过取消引用空指针),调用方无法传递空引用。并且允许编译器在任何时间点假设以前没有未定义的行为。引用不能为null。遗憾的是,引用仍然可以是null指针。您只需要犯多个错误就可以完成它。@user4581301:如果它变成一个null ptr,那就是未定义的行为。我知道一个事实,MSVC允许它,而Clang优化/删除你的代码时,依靠它是公平的MSVC,这是不允许的,而容忍。但是你可以看到MSVC正在朝着改进标准一致性的方向发展,所以不要指望这一点。@MSalters我完全同意“不会为引用变量分配额外的内存”,这是绝对不能保证的。编译器甚至可以用与指针相同的方式实现引用变量。@通常不应该有额外的分配,正如前面提到的,符号表中会有一个新条目,通常编译器会为引用变量指定一个别名。此外,您可以在函数调用中使用的引用变量的数量也受到限制,我也以某种方式将其与此联系起来。@为了更好地理解添加可以运行的源代码,您会发现变量和引用变量地址是相同的。如前所述,引用没有自己的地址(因为它们不是对象)。它们仍然(经常)占用空间,你的示例代码不能证明任何东西。请通过下面的链接。根据我的理解,如果某个东西占用内存中的空间,那么它也应该包含单独的地址,它不应该指向相同的地址。
int main()
{
  int i = 10;
  int& j = i;

  printf(" address of i = %u address of j = %u", &i, &j);
  return 0;
}