这与this question有关。我有一个函数void doConfig(mappings, int& numOfMappings)
,我不知道如何声明映射。它是一个二维数组,其元素是字符。第一个维度在运行时确定,并将在函数体中计算。第二个维度总是2.这是什么代码?我想象它是char** mappings
或类似的东西。在C ++中,数组总是通过引用传递吗?所以我不需要使用&
,即使我打算在函数返回时使用该值?
编辑:基本上我想退回 char (*mapping)[2] = new char[numOfMappings][2];
根据2to1mux的建议,我仍然无法让它发挥作用。数组似乎得到了正确的值,但是当doConfig()
函数返回时出现了错误。
int main()
{
int numOfMappings = 0;
char **mappings;
doConfig(mappings, numOfMappings);
cout << "This is mappings" << mappings << endl;//this address is different than the one given in doConfig(), is that wrong?
cout << "this is numOfMappings: " << numOfMappings << endl;
cout << mappings[0][0] << "->" << mappings[0][1] << endl;//program crashes here
//code removed
return EXIT_SUCCESS;
}
void doConfig(char **mappings, int& numOfMappings)
{
//code removed, numOfMappings calculated
for(int j = 0; j < numOfMappings; j++)
{
getline(settingsFile, setting);
mappings[j] = new char[2];
mappings[j][0] = setting.at(0);
mappings[j][1] = setting.at(2);
}
for(int j = 0; j < numOfMappings; j++)
cout << mappings[j][0] << "->" << mappings[j][1] << endl;//everything is as expected so array created ok
cout << "This is mappings" << mappings << endl;//different address than the one give in main
}
好的我现在已经开始工作了,但主要是来自于周围。有人可以解释一下他们如何知道何时使用*
和&
的解决方案吗?
答案 0 :(得分:2)
既然你标记了问题C ++而不是C,我想你可能想要一个合适的解决方案。
template<typename T>
using vectorOf2D = std::vector<std::array<T, 2>>;
vectorOf2D<char> getMappings() {
return /* whatever you do to fill those */;
// (most probably) using NRVO to ellide the copy
}
如果您担心访问可能会很复杂:
auto mappings = getMappings();
functionTakingAMapping(mappings[i]);
char element = mappings[0][1];
答案 1 :(得分:2)
(跟进我对相关问题的回答。)
直接(但相当复杂)的语法是
char (*create_mappings(size_t n))[2]
{
// Allocate an char[n][2] array
char (*mappings)[2] = new char[n][2];
// Initailize `mappings[i][j]` in any way you want...
return mappings;
}
但更好的想法是通过typedef
typedef char Char2[2];
Char2 *create_mappings(size_t n)
{
// Allocate an char[n][2] array
Char2 *mappings = new Char2[n];
// Initailize `mappings[i][j]` in any way you want...
return mappings;
}
答案 2 :(得分:1)
我会先回答你的问题:
正确,您无需在此使用&
。
术语按引用技术上不适用于传递数组,但对问题的简单回答是,您永远不会将数组的副本传递给函数。对类型数组的参数所做的任何更改都将应用于原始数组,而不是副本。
我建议传递一个双指针:
void doConfig(char **mappings, int& numOfMappings)
您将能够像访问二维数组一样访问映射成员。例如:
mappings[2][3] = 'b';
编辑:这是基于您的澄清的新建议
void doConfig(char** mappings, int& numOfMappings){
/*Compute numOfMappings --
this integer is passed by-reference, so it can be used outside function
to figure out the size allocated within the function*/
mappings = new char*[numOfMappings];
for(int i=0; i < numOfMappings; i++){
mappings[i] = new char[2];
}
/*Do whatever you need to do with mappings*/
/*Return nothing because function is void -- since mappings is passed as
pointer, changes are maintained after function ends*/
}
答案 3 :(得分:0)
您可以返回指向2D数组的指针。
例如,
char **ptr;
return ptr;
在传递数组地址时,您不必使用&amp; operator,如果要传递2D数组的起始位置的地址而不是特定元素的地址。