【问题标题】:Passing pointer to a member of a struct to a function将指向结构成员的指针传递给函数
【发布时间】:2013-08-05 07:17:21
【问题描述】:

我使用下面的程序来交换矩形结构的长宽

typedef struct rectangle
{
  int len;
  int wid;
} rect;

void swap(int* a, int * b)
{
  int temp;
  temp= *a;     
  *a=*b;
  *b=temp;
}

int main()
{
  rect rect1;
  rect *r1;
  r1= &rect1;
  r1->len=10;
  r1->wid=5;

  cout<< "area of rect " << r1->len * r1->wid<<endl;
  swap(&r1->len,&r1->wid);

  cout<< "length=" << rect1.len<<endl;
  cout<<"width=" <<rect1.wid;
}

但是,当我使用以下内容时:

swap(r1->len,r1->wid);

代替:

swap(&r1->len,&r1->wid);

我仍然得到正确的结果,但我不确定它是如何工作的。根据我的理解,我应该使用(&amp;r1-&gt;) 将成员变量的地址传递给函数。谁能解释一下?

【问题讨论】:

  • 如果你省略&amp;s,它甚至不会编译...
  • 即使编译时带有大量警告,它也会导致分段错误。查看整数值的地址。
  • 你用的是什么编译器?你在写 C 还是 C++? AFAIK“cout”不是 C 输入/输出命令
  • 我正在使用 C++ 编译器。它正在编译而没有任何警告并给出正确的结果。这就是为什么我感到困惑并提出这个问题。
  • @user2652117 我很好奇你现在用的是哪个编译器……

标签: c++ function pointers structure


【解决方案1】:

你是using namespace std;

在标准 c++ 库中存在this version of the swap function,它接受两个引用并驻留在std 命名空间中。

当您使用&amp; 时,您的函数将被调用。如果不是,它是来自标准库的那个。事实上,使用using 指令,您不需要在函数名称前添加std::。因此,在您的情况下,您的 swap 函数作为标准库中的函数的重载存在。

【讨论】:

  • 这就是为什么放置using namespace std 是一种不好的做法。
  • 是的,我明白了。即使从程序中删除了我的 swap() 函数,我也得到了相同的结果。正如您所说,这里调用了 std lib 中的 swap() 函数。这解决了我的问题。非常感谢您的回复:) :)
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2018-12-07
  • 1970-01-01
  • 2012-08-01
  • 2017-01-19
  • 2017-05-16
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多