【问题标题】:Where are the pointers supposed to be?指针应该在哪里?
【发布时间】:2014-05-04 06:03:01
【问题描述】:

不熟悉C++编程, 试图在这里概念化一个问题:

在本练习中,我们将限制自己使用一种数字类型, float,所以我们需要一个这种类型的数组;称之为 fmemory。但是,指针值 (地址)也存储在内存中,因此我们需要另一个数组来存储它们。自从 我们使用数组索引来建模地址,以及除了最大数组之外的所有索引 可以存储在 int 类型中,我们将创建一个这种类型的数组(称为 pmemory)来保存这些 “指针。”

fmemory 的索引(称为 fmem_top)指向下一个可用位置 值可以存储。有一个与 pmemory 类似的索引(称为 pmem_top)。别担心 关于耗尽“内存”。我们假设这些数组足够大,这样每个 当我们存储一些东西时,我们可以简单地将它插入到数组中的下一个索引号处。 除此之外,我们不会担心内存管理。

创建一个名为 Float 的类。我们将使用它来模拟存储的 float 类型的数字 在 fmemory 而不是真实内存中。 Float 中唯一的实例数据是它自己的“地址”; 即其浮点值存储在 fmemory 中的索引。调用此实例变量 地址。 Float 类还需要两个成员函数。第一个是单参数构造函数 用浮点值初始化浮点数。此构造函数存储浮点数 fmem_top 指向的 fmemory 的元素中的值,并存储 地址中的 fmem_top。这类似于编译器和链接器如何安排存储一个普通的 实内存中的变量。第二个成员函数是重载的 & 运算符。 它只是在 addr 中返回指针(实际上是索引,类型 int)值。

所以,我推断的是我需要创建这样的东西

#include <iostream>
using namespace std;
class Float
{
private:
int addr;
float fmem_top,pmem_top;
public:
Float(float* fmem_top){};
Float(int* addr){}
};

int main()
{
//this is where I become confused
}

我会在 main 方法中使用这样的东西吗? 浮动 fmem; 浮动 pmem;

【问题讨论】:

  • 如果您的老师给您示例使用代码作为她/他想要的说明,那就太好了。阅读作业我认为 Float 就像 Float f1, f2; 一样简单地使用。
  • 好吧,这很有道理。如果我想显示地址,我该如何调用main方法中的地址?
  • 听起来像是一个疯狂的问题,旨在迷惑新程序员并让他们停止编程。

标签: c++ arrays pointers


【解决方案1】:

试试这个。我认为这个练习是为初学者抽象的。 (虽然我没有编译这个,更多的是让你理解这个概念。)

const int NUM_FLOATS_MAX = 1000;

class Float
{
    static float floatArr[];
    static int fmem_top;
    int addr;
public:
    int operator&() { return addr; }
    Float(float f) { floatArr[fmem_top] = f; addr = fmem_top; fmem_top++; }
}
// static members need to be defined outside the class declaration
float Float::floatArr[NUM_FLOATS_MAX];
int Float::fmem_top = 0;

// should print 0 and 1, the indices. (How we get the float value
// we don't know -- overload the operator*()?
int main() 
{ 
    Float f1 = 1, f2 = 2;
    cout << &f1 << endl << &f2 << endl; 
}

【讨论】:

    【解决方案2】:

    在本练习中,我们将自己限制为一种数字类型,浮点数,因此我们需要一个这种类型的数组;称之为 fmemory。但是,指针值(地址)也存储在内存中,因此我们需要另一个数组来存储它们。由于我们使用数组索引来模拟地址,并且除了最大数组之外的所有索引都可以存储在 int 类型中,我们将创建一个这种类型的数组(称为 pmemory)来保存这些“指针”。

    float fmemory[N]; // "we'll need an array of [float]"
    int pmemory[N];   // "we'll create an array... pmemory"
    

    fmemory 的索引(称为 fmem_top)指向下一个可以存储浮点值的可用位置。有一个与 pmemory 类似的索引(称为 pmem_top)。不用担心“内存”用完。我们假设这些数组足够大,以至于每次我们存储一些东西时,我们都可以简单地将它插入到数组中的下一个索引号处。除此之外,我们不会担心内存管理。

    int fmem_top = 0; // "next available place..." fmemory[fmem_top]
    int pmem_top = 0; // "similar index to pmemory"
    

    创建一个名为 Float 的类。我们将使用它来模拟存储在 fmemory 而不是实际内存中的 float 类型的数字。 Float 中唯一的实例数据是它自己的“地址”;即其浮点值存储在 fmemory 中的索引。调用这个实例变量addr。

    class Float
    {
        int addr;
    

    类 Float 也需要两个成员函数。第一个是单参数构造函数,用浮点值初始化 Float。该构造函数将float值存储在fmem_top指向的fmemory的元素中,并将fmem_top的值存储在addr中。

    Float(float f)
    {
        fmemory[fmem_top] = f;
        addr = fmem_top;
        ++fmem_top;
    }
    

    这类似于编译器和链接器将普通变量存储在实内存中的方式。

    是的。

    第二个成员函数是重载的 & 运算符。它只是在 addr 中返回指针(实际上是索引,类型 int)值。

    int operator&() { return addr; }
    

    讨论

    没有迹象表明pmemory 的预期用途,因此不清楚应该如何处理它。这真的没有多大意义。

    总的来说,Float 的接口没有为使用它的代码提供任何干净的抽象:存储值的索引可以用&amp; 检索,但调用者仍然需要了解fmemory 才能找到实际的float 值。

    我希望课程有所改进......

    【讨论】:

    • 感谢您为我打破它,我想我很不正常。第二部分我认为使用了 pmemory,我没有包括它,因为我觉得我真的需要这部分的帮助。我希望课程也有所改进。
    • @Bygonaut 不客气。祝其余的要求和课程好运。
    猜你喜欢
    • 2015-03-11
    • 2014-08-24
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多