Rerefence到const char *数组

时间:2016-10-08 14:01:33

标签: c++ c arrays

我试图避免为5个不同的数组重复我的代码。我有3个阵列(未来可能更多):

<?php if(#date != null)

每个元素都不一样。现在他们是因为我只是复制并粘贴它们。元素数量也没有。

我有一个函数,我想根据我给出的值作为参数打印列表的每个元素。此外,我需要以其他颜色打印其中一个元素(全部为白色,绿色除外)。

我只想拥有一个用于打印和选择颜色的代码。但是我想在这之前选择正确的数组。我想过:

const char *FirstlistOfOptionText[2]   = {OPT_1, 
                                         OPT_2};
const char *SecondlistOfOptionText[2]   = {OPT_1, 
                                         OPT_2};
const char *ThirdlistOfOptionText[2]  = {OPT_1, 
                                         OPT_2};    

但是我在“listOfOptions&#39;”的存储空间大小方面遇到了一些错误。不知道。或者我不能将const char **用于char *或类似的东西。

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

const char *FirstlistOfOptionText[2]是一个包含两个指向char的指针的数组。

const char *listOfOptions[]是一个未知大小的数组,带有指向char的指针。

const char **listOfOptions;是指向char的指针,你可以为它分配选项列表数组的地址:

listOfOptions = FirstlistOfOptionText;

答案 1 :(得分:1)

基本上你需要将listOfOptions设为char **;

可以通过指向指针的指针引用指针数组(这就是char **)。

使用listOfOptions的任何人都不知道大小,因此您需要一种方法来确定大小。使用NULL指针终止列表,或者必须使用跟踪大小的第二个变量(listOfOptionsSize)。

所以下面的代码应该编译(我选择了NULL终止列表)。

const char *FirstlistOfOptionText[]   = {"a",  "b", NULL};
const char *SecondlistOfOptionText[]   = {"c", "d", "e", "f", NULL};
const char *ThirdlistOfOptionText[]  = {"e",  "f", "g", NULL};    

const char **listOfOptions= NULL;  // pointer to pointer(s)
int first_level_option= 2;         // some value for testing


if(first_level_option == 0) {
    listOfOptions = FirstlistOfOptionText;
}
if(first_level_option == 1) {
    listOfOptions = SecondlistOfOptionText;
}
if (first_level_option == 2) {
    listOfOptions = ThirdlistOfOptionText;
}

printem(listOfOptions);

现在对于你的打印功能,它会将指针列表的指针作为参数,并且看起来像这样:

void printem(const char **listOfOptions)
{
     const char *word;

     while (*listOfOptions!=NULL) {  // while the pointer in the list not NULL
        word= *listOfOptions;        // get the char * to which listOfOptions is pointing
        printf("entry: %s\n", word);
        listOfOptions++;
     }
}

哦,欢迎来到C-Pointer地狱: - )

答案 2 :(得分:0)

const char *listOfOptions[];
     

但是我对“listOfOptions”的存储大小有些错误是未知的。

数组的大小是其类型的一部分。 T[1]T[2]是不同的类型。

没有指定大小的数组是不完整类型,您无法创建不完整类型的对象。

  

或者我不能将const char **用于char *或类似的东西。

是的,因为那些是完全不同的类型。第一个是指向常量char对象的指针。第二个是指向非常量char对象的指针。

您的代码会尝试将数组视为一等公民,您可以将其指定为“普通”对象,例如int。它还试图平等地处理不同维度的数组。这些都不起作用。 C ++数组比你想象的更有限。

因此,解决方案是使用std::vector。当你接触它时,std::string而不是char*

#include <string>
#include <vector>

#define OPT_1 "a"
#define OPT_2 "b"

int main()
{
    std::vector<std::string> FirstlistOfOptionText = { OPT_1, OPT_2 };
    std::vector<std::string> SecondlistOfOptionText = { OPT_1, OPT_2 };
    std::vector<std::string> ThirdlistOfOptionText = { OPT_1, OPT_2 };    

    int first_level_option = 0;

    std::vector<std::string> listOfOptions;

    if (first_level_option == 0) {
        listOfOptions = FirstlistOfOptionText;
    }
    if (first_level_option == 1) {
        listOfOptions = SecondlistOfOptionText;
    }
    if (first_level_option == 2) {
        listOfOptions = ThirdlistOfOptionText;
    }
}

当然,这可以(而且应该)进一步改进。例如,删除预处理器宏并将列表选择放入像std::vector<std::string> GetListOfOptions(int)这样的函数中。

答案 3 :(得分:0)

要打印选项列表,您可以使用模板函数,该函数将静态数组作为参数引用:

template <int n>
void PrintOptions(const char* (&listOfOptions)[N])
{
    for (int i = 0; i < N; i++)
    {
        //actual printing
    }   
}

void PrintMenu(/* ... */)
{
    //...

    switch (menu_t.first_level_option)
    {
        case 0:
            PrintOptions(FirstlistOfOptionText);
            break;
        case 1:
            PrintOptions(SecondlistOfOptionText);
            break;
        case 2:
            PrintOptions(ThirdlistOfOptionText);
            break;
    }

    //...
}

数组的大小将由编译器推断。