【问题标题】:Changing variable when passing by value按值传递时更改变量
【发布时间】:2013-04-04 05:44:17
【问题描述】:

我有一个声明双精度的主函数。然后它将它传递给 void Display,后者显示双精度。然后 main 将 double(按值)传递给函数 void Pointers,该函数调用 display 函数,然后更改 double 的值。然后我再次从 main 中运行 display 函数,再次将它传递给 double。但是双精度已更改为新值(我们在 Pointers() 中将其更改为),我不明白为什么。

据我了解,当我们通过值传递时,我们正在向函数传递一个副本以供使用,它可以对该副本执行任何操作,但不会更改原始版本。如果我们通过引用传递,那么我们只是将地址传递给原始数据。

既然我们是按值传递的,它不应该改变它自己的副本并留下原来的吗?

以下代码供参考。

#include <iostream>
#include <cctype>
#include <string>
#include <vector>
#include <iomanip>
#include <windows.h> // for a bigger window
using namespace std;

void Heading()
{
    system("cls");
    cout << "David Fritz, CO127, 04/9/2013 Assignment 14 (Week 12)";
    cout << endl;
    cout << endl;
}
void Display(string source, double &value, double* &pointer)
{
    cout << "Source: " << source << endl;
    cout << "Double Address: " << &value << endl;
    cout << "Double Value: " << value << endl;
    cout << "Pointer Address: " << &pointer << endl;
    cout << "Pointer Value: " << pointer << endl;
    cout << "Dereferenced Pointer Value: " << *pointer << endl << endl;
}

void Pointer(double value, double* &pointer)
{
    string source = "Method";
    Display(source, value, pointer);
    value = 7;
    *pointer = value;
}

int main()
//2.    In the main
//       •    Call the heading function
//       •    Create a double and assigns it a value
//       •    Create a pointer that points to the double
{
    MoveWindow(GetConsoleWindow(), 100, 0, 700, 800, TRUE); //moves and resizes window
    Heading();
    string source = "Main";
    double aValue = 4;
    double* pointer = &aValue;
    Display(source, aValue, pointer);
    //system("pause");
    Pointer(aValue, pointer);
    //system("pause");
    Display(source, aValue, pointer);
    cout << endl;
    cout << "Q: If you pass the double by value to the function, why does the value of     the" << endl 
         << "double change in the main after you return from the function?" << endl     << endl;
    cout << "A: I dont know. We passed it its own copy, but it didn't care. I'll figure     it out"
}

这是作业(我发布它是因为第 5 步特别告诉我如何传递双精度和指针)

编写一个创建程序
1. 创建一个标题函数,显示您的姓名、班级编号和日期。
2.在主
• 调用航向函数
• 创建一个双精度并为其赋值
• 创建一个指向双精度的指针
3. 编写一个 Display 函数,该函数接受一个字符串、一个指针和一个 double,并使用 cout 语句来显示描述您正在显示的内容的文本,然后依次显示它们:
显示它的位置(从 main 或方法调用?)
双地址
双重价值
指针地址
指针值(指针保存地址,这应该是双精度的地址)
取消引用的指针值(指针指向的,双精度值)
4.从main调用display函数,显示指针和double的属性。
5. 创建一个返回类型为 void 的函数,该函数从 main 中获取一个指针和一个双精度(按值传递双精度)。然后像在 main 中一样显示指针的值并加倍。
• 更改双精度值,然后将双精度值分配给该点 (*pointer = double)
• 如果 ptr 是点名称,x 是双精度点的名称,则 *ptr = x;
6.返回主重新显示指针和double的属性
7. 添加暂停。
8. 回答这个问题:
• 调用航向函数
• 显示以下问题及其答案。
“如果你将double按值传递给函数,为什么你从函数返回后,main中double的值会发生变化?”

【问题讨论】:

    标签: pass-by-reference pass-by-value pass-by-pointer


    【解决方案1】:

    Pointer() 确实得到了它自己的副本(双精度值),并且改变它不会改变主函数中的值。

    但是,您还向 Pointer() 传递了一个地址(双 *pointer),并将该地址处的内容也设置为值 (7),使用“*pointer = value;”。因为你给 Pointer() aValue (&aValue) 的地址,所以它在 main() 中发生了变化。

    编辑:所以你是正确的按值传递而不改变原始版本,但在这种情况下,你已经通过值 通过'reference'(嗯,一个指针,这是排序就像一个参考),所以它改变了。

    还有一些其他的东西:

    a)您的缩进有点混乱(尽管这可能只是复制和粘贴造成的) b) 通过引用(double * &pointer)传递指针是不必要的,除非你想改变'pointer'的值,而不是它指向的地址的值。可能'double *pointer'更好。

    干杯

    【讨论】:

      【解决方案2】:

      检查此版本。 它很完整,而且好多了。

                  #include <iostream>
                  #include <string>
                  #include <iomanip>
                  using namespace std;
      
                  void Display(string source, double &value, double* pointer)
                  {
                      cout << source << endl;
                      cout << left << setw(40) << "Original Double Address: "             << &value   << endl;
                      cout << left << setw(40) << "Original Double Value: "               << value    << endl;
                      cout << left << setw(40) << "Original Pointer Address: "            << &pointer << endl;
                      cout << left << setw(40) << "Original Pointer Value: "              << pointer  << endl;
                      cout << left << setw(40) << "Original Dereferenced Pointer Value: " << *pointer << endl << endl;
                  }
      
                  void Pointer(double value, double *pointer)
                  {
                      string source = "Pointer Function";
                      value = 1842;
                      *pointer = value;
                      Display(source, value, pointer);
                  }
      
                  void main()
                  {
                      cout << "Student Name, CO127, Assignment 14.1" << endl << endl;
      
                      string source = "Main";
                      double aValue = 921;
                      double* pointer = &aValue;
      
                      // Initial Values Displayed
                      Display(source, aValue, pointer);
      
                      // Values after passing to function
                      Pointer(aValue, pointer);
      
                      // Values from main after being modified in function.
                      Display(source, aValue, pointer);
      
                      cout << endl;
                      cout << "Answer " << endl;
                  }
      

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        相关资源
        最近更新 更多