【问题标题】:C++ pointers and addressesC++ 指针和地址
【发布时间】:2020-07-06 23:33:17
【问题描述】:

我只是将指针用作函数参数,我知道这一点。

#include <iostream>
using namespace std;
void func(int *a)
{
  *a+=1;
  return;
}

int main()
{
  int a=1;
  cout<<a<<endl;//prints 1
  func(&a);
  cout<<a;//prints 2
  return 0;
}

我的问题是为什么下面的代码与上面的代码类似,更准确地说

当我们从主函数调用 func(&a) 时在上述情况下

// 4字节(int大小)数据的起始地址被传递,在我们的函数(func)中,这个地址存储在本地指针'a'中,当我们写*(a)时,我们的编译器知道读取4 个字节的数据,因为它是一个整数指针。

简而言之,我的问题是

我们传递给 'func' 的具体内容是什么 当我们调用 func(a) 时,'a' 是一个存储整数值的变量 func(int &a) 到底是什么意思

#include <iostream>

using namespace std;

void func(int &a)
{
  //cout<<*a;// error 
  a+=1;
  //  cout<<a<<endl;
}

int main()
{
  int a=1;
  cout<<a<<endl;// prints 1 
  func(a);
  cout<<a;// prints 2

  return 0;
}

抱歉英语不好

【问题讨论】:

  • 提示:谷歌什么是reference。你在这里通过引用传递a

标签: c++ function pointers


【解决方案1】:

读取指针和引用的一种方法是,在声明期间,“*”可以替换为“指向的东西”。 所以:

int* a;

意味着“a”是指向整数的东西(即“a”是一个指针)。

在代码的其他地方(不是声明),“*”可以替换为“指向的东西”。 所以:

*a = 5;

表示“'a'指向的东西等于5”。 IE。 a 指向的整数现在是 5。

在您的第一个代码块中,“a”只是一个整数类型。当您编写 func(&a); 时,您将“a”的地址(即存储“a”值的内存位置的名称)传递给函数。该函数需要一个 int* 类型(指向 int 的东西),这正是您给它的。

在函数中,'a' 只是变量的地址。然后该函数获取这个地址,并说“增加 'a' 指向的东西”。

在您的第二个代码块中,“a”再次只是一个整数类型。然而,这一次,函数需要一个引用变量(因为函数定义需要一个 int& 类型。

所以在函数中,'a' 是原始变量 - 不是副本或指向原始变量的指针。该函数说“增加发送的实际整数”。

Read more

【讨论】:

    【解决方案2】:

    这两种情况的工作方式相似:

    案例 1:func 需要一些指向整数 (int *a) 某个方向的指针,正如您所说,根据操作系统,这是 sizeof (int) 字节块的第一个字节。当调用 func 时,您正确传递了该方向 func(&amp;a),因此编译器认为该调用类似于:int p = &amp;a; func(p); 无论如何,指向该方向的指针实际上就是传递的内容。

    案例 2:func 期望某个整数的某个方向 (int &amp;a)。当调用 func 时,您只需正确传递值 func(a),因为所有 C++ 编译器都支持引用参数,编译器在内部传递传递值的方向 func (&amp;a)。请注意,如果您尝试像 func (&amp;a) 一样调用 func,则会发生错误,因为它会在编译器等待 (&amp;a) 时传递类似 func (&amp;&amp;a) 的内容。

    OBS:我们也可以将第二种情况 void func(int &amp;a) 作为参考,它不同于带有示例的指针:

    int a = 10;
    int &b = a;
    cout<<a; //10 is printed
    cout<<b; //10 is printed
    b = 20;
    cout<<a; //20 is printed
    cout<<b; //20 is printed
    

    无论您修改对a 的引用(即b)还是直接修改a,您都在修改相同的值,因为它们与a 的方向相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2013-07-12
      • 2013-11-05
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多