【发布时间】:2017-07-15 16:12:48
【问题描述】:
我在大学课堂上学习了 C 和指针,我认为我已经很好地掌握了这个概念,除了多维数组和指针之间的相似性。
我认为由于所有数组(甚至是多维数组)都存储在连续内存中,因此您可以安全地将其转换为 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.
这里发生了什么?你怎么能改变函数调用,让其中一个接受数组?
我的original question 被标记为重复项,由于我不知道如何删除重复项,所以我再次询问。
编辑:这不是与How to pass a multidimensional array to a function in C and C++ 的重复,因为我问的是如何更改函数调用本身,而不是函数签名。我知道其中一个函数是正确的,但我不确定是哪一个或您将如何调用它。
编辑 2:这是我原来的问题的重复,但原来的问题被错误地标记为重复,无法得到回答,所以我重新问了。
【问题讨论】:
-
您可以通过编辑旧问题来删除重复的关闭,以明确它不是重复的(包括链接您引用的帖子),然后等待它得到足够的重新打开票。然后您不做的是再次发布重复的问题。 help center 有更多关于如果您的问题被关闭该怎么办的信息;它在询问部分。
-
这是部分您链接到的问题的副本。数组数组不与指向指针的指针相同。参见例如this old answer of mine 解释原因。
-
下次您的问题已关闭并且您希望重新打开它时,请不要接受答案。如果这样做,则表示您对它感到满意,因此没有理由重新打开它。
标签: c arrays pointers multidimensional-array