传递值时更改变量

时间:2013-04-11 21:01:52

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

我有一个声明double的main函数。然后它将它传递给void Display,它显示double。然后main将double(by值)传递给函数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.在主体中        •调用标题功能
       •创建一个double并为其赋值        •创建指向双重的指针 3.编写一个显示函数,该函数接受一个字符串,一个指针和一个double,并使用cout语句显示描述您正在显示的内容的文本,然后依次显示每个语句:
              它显示的位置(从main或方法调用?)
              双地址
              双值
              指针地址
              指针值(指针保存地址,这应该是double的地址)
              取消引用的指针值(指针指向的内容,double值)
4.从main调用显示功能以显示指针的属性并加倍 5.使用void返回类型创建一个函数,该函数从main获取指针和double(从值传递double)。然后显示指针的值,并按照主要内容加倍        •更改double的值,然后为该点指定double的值(* pointer = double)
       •如果ptr是点名称,x是double的名称,则* ptr = x;
6.返回主要重新显示指针和双重的属性 7.添加暂停 8.回答这一个问题:
       •调用标题功能
       •显示以下问题及其答案               “如果你将双重值传递给函数,为什么从函数返回后,double中的double值会发生变化?”

2 个答案:

答案 0 :(得分:0)

Pointer()确实获得了自己的副本(double值),并且更改此不会更改main函数中的值。

但是,你也传递Pointer()一个地址(double * pointer),并将该地址的东西设置为值(7),并带有“* pointer = value;”。因为你给了Pointer()aValue(&amp; aValue)的地址,所以它在main()中改变。

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

还有其他一些事情:

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

干杯

答案 1 :(得分:0)

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

            #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;
            }