2

私は C++ でのコーディングに比較的慣れていないので、ポインターとアドレスを扱うプログラムの作成を依頼されました。私が立ち往生している部分は、2 つのメモリ アドレスの違いを使用して分子の値を変更することです (分数を扱っています)。

これは私に与えられた課題です: http://cdn.frugalfinders.com/assignment.pdf

質問 2 で行き詰まっています。これまでの C++ コードは次のとおりです。

#include <iostream>
#include <fstream>
#include <cstring>
#include "fraction.h"
using namespace std;

int main()
{
    int i1;
    fraction f1(2,5);
    int i2;
    fraction farray[5];
    float x1;
    double x2;
    char c1;
    int A[6];
    int *ip1;
    float *fp1;
    fraction *ffp1;
    double *dp1;

    // Print the addresses of the variables
    cout << endl;
    cout << "i1 at:       " << &i1 << endl;
    cout << "f1 at:       " << &f1 << endl;
    cout << "i2 at:       " << &i2 << endl;
    cout << "farray at:   " << &farray << endl;
    cout << "x1 at:       " << &x1 << endl;
    cout << "x2 at:       " << &x2 << endl;
    cout << "c1 at:       " << &c1 << endl;
    cout << "A at:        " << &A << endl;
    cout << "ip1 at:      " << &ip1 << endl;
    cout << "fp1 at:      " << &fp1 << endl;
    cout << "ffp1 at:     " << &ffp1 << endl;
    cout << "dp1 at:      " << &dp1 << endl;

    // Print the values of the variables
    cout << endl;
    cout << "f1 is:       " << f1 << endl;
    cout << "ip1 is:      " << ip1 << endl;
    cout << "fp1 is:      " << fp1 << endl;
    cout << "ffp1 is:     " << ffp1 << endl;
    cout << "dp1 is:      " << dp1 << endl << endl;

    // Store the address of i2 in ip1
    ip1 = &i2;

    // Change the numerator of f1 to 23
    cout << f1 << endl;
    i1 = (&i2) - 4;
    *i1 = 23;
    cout << f1 << endl;

    return 0;
}

パーツを下に置く方法がわかりません

// Change the numerator of f1 to 23

仕事に。どんな助けでも大歓迎です!

4

2 に答える 2

1

コンピューターのメモリは連続しているため、スペースを変数に割り当てると、それらは次々に格納されます。i2 は f1 の直後に宣言されているため、f1 と i2 のアドレスの差によって、f1 に割り当てられたメモリ空間が得られます。ただし、違いを使用して分子の値を変更する方法がわかりません。違いにより、分子のアドレスではなく、f1 が占有するスペースが得られるからです。

于 2013-04-26T18:45:51.887 に答える
1

これで期待する出力が得られる可能性があると思います(確かに言うことは文字通り不可能です)

*(ip1 - 2) = 23;

しかし、本当にこの演習はゴミです。あなたの教授は、C++ では完全に違法であり、私が見る限り有用な目的を果たさないコードを書くようにあなたに求めています。

その理由を少し説明すると、ポインター演算を使用して、既存のアドレスから新しいアドレスを取得できます。ただし、ポインター演算は特定の状況でのみ有効であり、ポインター演算を使用してある変数のアドレスを別の変数のアドレスから取得することは有効ではありません。しかし、それがあなたに求められていることです。

于 2013-04-26T18:36:58.113 に答える