转发指向值的指针,而不是值本身

时间:2013-04-09 20:17:06

标签: c++ pointers

我希望将数组的精灵放到字符数组中......(很奇怪,我知道,但我不能使用STL lib) 所以我已将其声明为:const char *** DbRecord; DbRecord = new const char**[1000];

然后我有了这个功能:

 bool AddToArray(const char* value,
        const char *** database);

如何将指向const char * value的指针存储到位置[0]上的DbRecord?以及如何访问它然后能够读取实际保存在那里而不是指针的值?我对C ++中的指针感到困惑: - /感谢您的解释......

3 个答案:

答案 0 :(得分:1)

  

如何将指向该const char *值的指针存储到位置[0]的DbRecord上?

你不能,因为一旦函数结束,value将超出范围。

你真的需要三颗星吗?在我看来,两个应该足够了:

const char** DbRecord;
DbRecord = new const char*[1000];

void AddToArray(const char* value, const char** database)
{
    database[0] = value;
}

答案 1 :(得分:1)

DbRecord是一个指向const char **的指针数组,所以当你说DbRecord[0]时,它实际上意味着3D char数组的第一行,哪些元素是const char**类型。因此,DbRecord[0][0] = value会将变量value存储在index row [0][0],如果这是您想要的。

为DbRecord分配内存时,只执行

DbRecord = new const char**[1000];

是不够的,你必须设置其他两个维度的大小。

您可以尝试使用std::string替换const char *vector<vector<string>>来替换 在C ++中const char ***,在这种情况下,您不再需要担心这些指针。

答案 2 :(得分:1)

确定。你问的问题很简单。 :)

  

我希望将一系列精灵用于数组......

你走在正确的轨道上。至少那是char *[]。但是,众所周知,这很容易转化为char **。当然,要有一个指向存储的指针,您需要添加第三个星。到目前为止,你的问题是正确的。

  

如何将指向该const char *值的指针存储到位置[0]

上的DbRecord

有两种方法可以做到这一点。 问你的问题的正确答案是取消引用指针。例如:

bool AddToArray(const char* value,
    const char *** database)
{
    bool success = false;
    ((*database)[0]) = value;
    if ( (*database)[0] == value ) success == true;
    return success;
}

从技术上讲,将指针作为数组访问也会将其作为索引取消引用。所以[0]会直接取消引用指针。根据您的分配和记忆布局,您也可以这样做:

...
(*(database[0])) = value;
...

注意那里的细微差别。第一个示例将其视为指向指针数组的指针(或指向数组数组的指针,具体取决于您的想法),第二个示例将其视为指向数组的指针数组(或指针指针数组)。

学习掌握多个指针级别是您作为C开发人员可以做的最好的事情之一,但它通常是C ++中令人不快的练习。

希望这有帮助。

修改:char *[]而非char [][]