我知道*
定义了一个指针...... **
定义指向指针的指针吗?
如果是这样,为什么?
指针指针有时被称为引用吗?只需要澄清以下非常简单的哈希。
通常指针用于传递较大结构的位置,因为整个内容过于昂贵。
我已经看到指向quantlib项目中用于创建“句柄”的指针的指针,因为每个“观察者”都持有一个指向“术语结构”指针的指针,该指针可能在运行时发生变化,因此指针保持位置另一个指针。
但是我在这里看不到相关性?
class hash_entry
{
private:
int key;
int value;
public:
hash_entry(int key, int value)
{
this->key = key;
this->value = value;
}
int getKey()
{
return key;
}
int getValue()
{
return value;
}
};
class hash_map
{
private:
hash_entry **table;
static const int TABLE_SIZE = 128;
public:
hash_map()
{
table = new hash_entry*[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = NULL;
}
int get(int key)
{
int hash = (key % TABLE_SIZE);
while (table[hash] != NULL && table[hash]->getKey() != key)
hash = (hash + 1) % TABLE_SIZE;
if (table[hash] == NULL)
return -1;
else
return table[hash]->getValue();
}
void put(int key, int value)
{
int hash = (key % TABLE_SIZE);
while (table[hash] != NULL && table[hash]->getKey() != key)
hash = (hash + 1) % TABLE_SIZE;
if (table[hash] != NULL)
delete table[hash];
table[hash] = new hash_entry(key, value);
}
~hash_map()
{
for (int i = 0; i < TABLE_SIZE; i++)
if (table[i] != NULL)
delete table[i];
delete[] table;
}
};
答案 0 :(得分:5)
是的,**
定义了指向指针的指针(因为规范是这样说的)。不,我无法想象有人称这是一个参考。
至于为什么他们在这种情况下使用它,他们正在编写(非常类似C)代码来动态分配指向X的指针数组。这段代码:
hash_entry **table;
[ ... ]
hash_map() {
table = new hash_entry*[TABLE_SIZE];
大致等同于:
std::vector<hash_entry *> table(TABLE_SIZE);
(虽然目前,我还没有把它拆开,因为你需要一个班级成员)。
答案 1 :(得分:3)
是的,**
是指向指针的指针,但不是,这与引用不同。在此上下文中,它用于创建动态分配的hash_entry
二维数组。
顺便问一下,你确定这段代码编译了吗?我看到一些似乎是语法错误的东西。
答案 2 :(得分:2)
你是正确的**
是指向指针的指针(虽然不正确,这是一个引用 - 引用用例如&int & foo
表示。)
在这种情况下,它的使用方式不是你所描述的(作为“句柄”),而是作为指向hash_entry
的指针数组
该行:
table = new hash_entry*[TABLE_SIZE];
表示“分配一块内存来保存hash_entry
指针,大小为TABLE_SIZE * sizeof(hash_entry*)
。从那里,数组被初始化为NULL
,之后你可以填充每个条目根据需要使用指针的数组。
答案 3 :(得分:0)
是的,**表示指向指针的指针。
添加额外级别的间接的一个原因是,您可以将最终指向的内容移动到物理内存中,而不会将代码指向需要直接通知新地址的something
。
如果内存管理器想要在内存中移动某些内容(例如,减少堆中的漏洞),它可以分配新内存,移动对象,并更新指针指针指向的地址以指向该内存新地址。
特别是在这种情况下,如果您的哈希条目多于TABLE_SIZE
,则代码可以使用更大的内存块重新分配hash_entry
,并使用新地址{{更新table
1}}。其余的代码可能对重新分配无知。
答案 4 :(得分:0)
我知道*定义一个指针......确定**定义一个指向指针的指针吗?
是
若是,为什么?
我假设你的意思是为什么有人会使用一个,而不是类型如何工作(参见任何c参考)。我看过几个地方并使用过它们:
*arg = ptr_to_return
)传递的指针“返回”指针。见,例如, getline()
指针指针有时被称为引用吗?只需要澄清以下非常简单的哈希。
不,引用本质上是通过引用传递,但让编译器为你跟踪指针。
通常指针用于传递较大结构的位置,因为整个内容过于昂贵。
是的,但不是唯一的。考虑一个更改结构成员的方法。您需要它来更改结构的副本,而不是通过值传递时的本地副本。
在此处的示例中,hash_entry **table;
被用作指向hash_entry
的(动态大小)指针数组。它可能更明确地被宣布为hash_entry *table[];