所以我以某种方式让这个工作,我真的很感兴趣为什么我的第一次尝试失败。
我有C的非正式经验,现在我正在尝试学习C ++。我想我会尝试一些常见的命令,比如将参数传递给函数,但在尝试访问传递的数组的内容时收到“不完整的类型错误”。
这是错误的代码:
void printoutarray(int array[][], int height, int width){
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++){
cout << array[x][y]) << " ";
}
cout<<"\n";
}
}
我能够使用指针修复代码:
void printoutarray(int *array, int height, int width){
for (int x = 0; x < width; x++){
for (int y = 0; y < height; y++){
cout << *(array+x*width+y) << " ";
}
cout<<"\n";
}
}
并像这样传递数组:
#define hght 5
#define wdth 5
/*Other code/main function*/
int inputarray[hght][wdth] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
printoutarray(*inputarray, hght, wdth);
但我的问题是为什么我必须专门发送函数指针的数组。数组变量不应该是指针本身吗?另外,为什么我需要在我的“固定”代码中包含dereference运算符,是因为我发送一个指针指针?我再次对这种语言的运作感到好奇,所以任何见解都会非常感激,谢谢!
答案 0 :(得分:3)
传递给函数时,数组被转换为指针(在C和C ++中为true)。你的错误似乎在于认为因为这个,当传递给函数时,2D数组应该被转换为双指针,这不是真的。
你有一个2D数组
int inputarray[hght][wdth] = ...;
查看此方法的一种方法是它是一个大小为hght
的数组,此数组的每个元素都是另一个大小为wdth
的数组。因此,在将此数组转换为指针时,您将获得指向大小为wdth
的数组的指针。喜欢这个
void printoutarray(int array[][wdth], int height, int width){
或更明确地像这样
void printoutarray(int (*array)[wdth], int height, int width){
使用这些轻微更改中的任何一个都可以使用原始代码。虽然在这两种情况下width
参数都没用,因为此函数仅适用于宽度为wdth
的数组
这里没有任何事情在C中也不会完全相同。
答案 1 :(得分:0)
除了Syntactial / typos之外,这两个函数之间没有本质区别。 “按值传递”根本不传递值,就像C一样,它传递指向第一个元素的指针。如果您给出的两个函数的编译器输出以任何有意义的方式不同,我会感到非常惊讶。