我正在学习C语言和指针,在大学课程中,我认为我对这个概念有了相当好的掌握,但是我对多维数组和指针之间的相似性感到困惑。
我以为所有的数组(甚至是多维数组)都被存储在连续的内存中,所以你可以安全地将它转换为一个int*(假设给定的数组是int[])。然而,我的教授说定义中星号的数量取决于数组的维数。因此,int[]将变成int*,int[][]将变成int**等。
于是我写了一个小程序来测试这个问题:
出乎意料的是,编译器在 两个 函数调用上都发出了警告。
这是怎么回事?你是如何更改函数调用,使其中一个接受数组的?
我的原问题被标记为重复,由于我无法弄清楚如何删除重复项,所以我再次提问。
编辑:这与如何将多维数组传递给C和C++中的函数不同,因为我正在询问如何更改函数调用本身,而不是函数签名。我知道其中一个函数是正确的,但我不确定哪一个或者如何调用它。
编辑2:这是我的原始问题的重复,但原始问题被错误地标记为重复,并且无法得到答案,因此我重新提出了这个问题。
我以为所有的数组(甚至是多维数组)都被存储在连续的内存中,所以你可以安全地将它转换为一个int*(假设给定的数组是int[])。然而,我的教授说定义中星号的数量取决于数组的维数。因此,int[]将变成int*,int[][]将变成int**等。
于是我写了一个小程序来测试这个问题:
void foo(int** ptr)
{
}
void bar(int* ptr)
{
}
int main()
{
int arr[3][4];
foo(arr);
bar(arr);
}
出乎意料的是,编译器在 两个 函数调用上都发出了警告。
main.c:22:9: warning: incompatible pointer types passing 'int [3][4]' to parameter of type
'int **' [-Wincompatible-pointer-types]
foo(arr);
^~~
main.c:8:16: note: passing argument to parameter 'ptr' here
void foo(int** ptr)
^
main.c:23:9: warning: incompatible pointer types passing 'int [3][4]' to parameter of type
'int *' [-Wincompatible-pointer-types]
bar(arr);
^~~
main.c:13:15: note: passing argument to parameter 'ptr' here
void bar(int* ptr)
^
2 warnings generated.
这是怎么回事?你是如何更改函数调用,使其中一个接受数组的?
我的原问题被标记为重复,由于我无法弄清楚如何删除重复项,所以我再次提问。
编辑:这与如何将多维数组传递给C和C++中的函数不同,因为我正在询问如何更改函数调用本身,而不是函数签名。我知道其中一个函数是正确的,但我不确定哪一个或者如何调用它。
编辑2:这是我的原始问题的重复,但原始问题被错误地标记为重复,并且无法得到答案,因此我重新提出了这个问题。