首页 > 解决方案 > C++ 指针和地址

问题描述

我只是在玩指针作为函数参数,我知道这一点。

#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 个字节data 因为它是一个整数指针。

简而言之,我的问题是

当我们调用 func(a) 时,我们传递给 'func' 到底是什么,其中 '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;
}

抱歉英语不好

标签: c++functionpointers

解决方案


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

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

情况 2:func 期望某个整数 ( int &a) 的某个方向。当调用 func 时,您只是正确传递了 value func(a),因为所有 C++ 编译器都支持引用参数,编译器在内部传递传递值的方向,func (&a). 请注意,如果您尝试像调用 func 一样调用func (&a)会发生错误,因为它会func (&&a)在编译器等待 ( &a) 时传递一些东西。

OBS:我们也可以将第二种情况void func(int &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(ie b) 的引用还是a直接修改,您都在修改相同的值,因为它们与 a 的方向相同。


推荐阅读