C ++返回指向2d字符数组的指针

时间:2014-05-22 14:35:31

标签: c++ arrays 2d

我有一个对象,它有一个2d char数组作为属性。

我想创建一个能够返回指向这个二维数组的指针的访问器方法。

我已经声明了这样的2d数组:

#define PRESET_LEN 15
#define NO_PRESETS 8

char camPresets[NO_PRESETS][PRESET_LEN];

对C ++不熟悉我有点费心去试图找出方法声明。

到目前为止,我在标题中有这个:

char** getPresetsForCamera(int cam);

,这在cpp

char** DataManager::getPresetsForCamera(int cam)
{
    if(currentCam != cam)
        load(cam);

    return camPresets;
}

但它没有编译。我显然没有理解如何正确使用指针,至少对于2D阵列,我想我可以写'return& camPresets;'返回数组的地址,但我错了。请有人告诉我我哪里出错了。谢谢,里克。

7 个答案:

答案 0 :(得分:2)

正确的丑陋语法是:

char (&DataManager::getPresetsForCamera())[NO_PRESETS][PRESET_LEN]
{
    if (currentCam != cam)
        load(cam);
    return camPresets;
}

可以使用typedef简化:

typedef char camPresetsType[NO_PRESETS][PRESET_LEN];

camPresetsType& getPresetsForCamera();

但我真的建议使用std::array或自定义类。

答案 1 :(得分:0)

你走了:

char* DataManager::getPresetsForCamera(int cam)
{
    if(currentCam != cam)
        load(cam);

    return camPresets[cam];
}

请注意,您还应该在使用之前检查该数组的边界。这是一个更安全的版本:

char* DataManager::getPresetsForCamera(unsigned int cam)
{
    assert(cam < NO_PRESETS);

    if(currentCam != cam)
        load(cam);

    return camPresets[cam];
}

答案 2 :(得分:0)

您可以通过将其声明为双指针并在函数中返回来为camPresets动态分配数组

查看示例

char **camPresets;

char** getPresetsForCamera(int cam);

char** getPresetsForCamera(int cam)
{
        //your validation
        return camPresets;
}

//Code to dynamically allocate memory
camPresets = (char**)malloc(NO_PRESETS* sizeof(char*)); 
    // for each row allocate Cols ints
    for (int row = 0; row < NO_PRESETS; row++) {
        camPresets[row] = (char*)malloc(PRESET_LEN* sizeof(char));
    }

答案 3 :(得分:0)

嗯,您需要认为指针和数组在语义上相似,但它们的语法不同。

通过定义2d数组:

char arr[W][H];

允许编译器计算原始数据块中元素的位置。请记住,元素[0] [0]基本上是指向已分配内存块开始的指针。例如,如果您定义了一个数组并访问过:

char arr[10][20];
char arr[5][5];

你告诉编译器“从开头移动5行和5列”,这很简单:5 * H + 5 = 5 * 20 + 5 = 105。

现在,此括号表示法是编译器的附加信息。但是如你所知,数组只是一块内存。您可能会认为具有相同的含义:

&arr[0][0] == arr; // true, arr is "char*"

这意味着指针符号不再为编译器提供数组维度的宽度,因此它不能使用索引运算符。该数组被认为是一个简单的连续数据块。

在你的情况下,你应该简单地返回一个char *。您无法从函数返回数组,但可以将其指定给指针变量。

char* newArr = fun(); // char* fun() { char* test = new char[10*20]; return test; }

为避免可能超出范围错误,请改用std :: vector。

答案 4 :(得分:0)

如果您关注使用std::vector,请使用std::array

#include <array>

#define PRESET_LEN 15
#define NO_PRESETS 8

typedef std::array<char, PRESET_LEN> InnerArray;
typedef std::array<InnerArray, NO_PRESETS> Array2D;

Array2D camPresets;

Array2D getPresetsForCamera(int cam)
{
   return camPresets;
}

答案 5 :(得分:0)

您有许多选项可用于返回2D数组。一种是使用锯齿状阵列,就像尝试做的那样。但是,如果你真的使用char **作为2D数组,你应该坚持使用它作为char **锯齿状数组,而不是像你正在做的那样使用2D数组以及为什么看到编译器错误

另一个选择,如果你坚持使用真正的2D数组(毕竟,它们比锯齿状数组更高效),只需将数组包装在结构中并返回结构,就像这样:

struct camPresetsArray
{
    char values[NO_PRESETS][PRESET_LEN];
};

camPresetsArray DataManager::getPresetsForCamera(int cam)
{
    ...
}

另一种选择是将返回值作为函数参数传递

typedef char camPresetsArray[NO_PRESETS][PRESET_LEN];

void DataManager::getPresetsForCamera(camPresetsArray& outp, int cam)
{
    ...
}


camPresetsArray x;
myDataManager.getPresetsForCamera(x, y);

答案 6 :(得分:0)

嗯,最后在阅读了这里留下的答案之后,我不想将任何库导入到我的代码中,所以我留下了一个二维数组。我最终使用了这段代码:

typedef char (*pointer_to_arrays)[PRESET_LEN];

pointer_to_arrays getPresetsForCamera(int cam);

然后在cpp

DataManager::pointer_to_arrays DataManager::getPresetsForCamera(int cam)
{
 if(currentCam != cam)
    load(cam);
 return camPresets;
}

感谢指点:P

相关问题