指针应该在哪里?

时间:2014-03-26 03:12:08

标签: c++ arrays pointers

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

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

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

创建一个名为Float的类。我们将使用它来模拟存储的float类型的数量 在fmemory而不是真正的记忆。 Float中唯一的实例数据是它自己的“地址”; 也就是说,其浮点值存储在fmemory中的索引。调用此实例变量 地址。 Float类还需要两个成员函数。第一个是单参数构造函数 使用浮点值初始化Float。此构造函数存储float fmem_top指向的fmemory元素中的值,并存储值 在addr中的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;

2 个答案:

答案 0 :(得分:1)

  

在本练习中,我们将自己局限于一个数值类型float,所以我们需要一个这种类型的数组;称之为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;
}
  

这类似于编译器和链接器如何安排将普通变量存储在实际内存中。

是的确定。

  

第二个成员函数是重载&amp;运营商。它只是在addr中返回指针(实际上是索引,类型为int)。

int operator&() { return addr; }

讨论

没有迹象显示pmemory的预期用途,因此不清楚应该用它做什么。它真的没有多大意义。

总的来说,Float的接口没有为使用它的代码提供任何干净的抽象:可以使用&检索存储的值索引,但是调用者仍然需要知道{ {1}}找到实际的fmemory值。

我希望课程能够改进......

答案 1 :(得分:0)

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

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