【发布时间】:2023-03-24 14:38:01
【问题描述】:
我知道有很多类似的问题,但我找不到答案。
当在我下面的代码中将二维 [3] [4] 数组传递给函数时,编译器如何知道指针递增多远,在我们递增 3 的最后一个 printf() 的情况下x 4 个内存位置,如果函数参数中缺少数字 3? 我的意思是,为什么只有 arr [] [4] 足够而不是 [3] [4]?谢谢
#include <stdio.h>
#include <stdlib.h>
int Fun(int arr[][4])
{
printf("%p\n", arr); // address of first element
printf("%p\n", arr[0] + 1); // address increments by 4, pointing to next "inner array"
printf("%p\n", arr + 1); // how does it know to increment address by 3 x 4 here? The complete array size
}
int main()
{
int arr[3][4] =
{
1,2,3,4,
5,6,7,8,
9,10,11,12
};
printf("%p\n", arr);
printf("%p\n", arr[0] + 1);
printf("%p\n", arr + 1);
printf("Passing to function\n");
Fun(arr);
return 0;
}
【问题讨论】:
-
我猜
sizeof (int)在您的实现中是 4。问题是,您正在增加 3 xsizeof (int)bytes (不是 3 * 4 *sizeof (int)字节)。试试int arr[3][7] = ... -
我不明白
-
假设您的值为 1 的元素位于地址 0x66600000。那么您的值为 2 的元素位于 0x66600000 +
sizeof (int)(可能是 0x66600004) -
我理解的那部分,然后 arr[0] + 1,将是 0x6660000C,因为我们递增为 0x66600000 + ( 4 * sizeof (int) )...但 arr + 1 将递增为 0x66600000 + 3 * 4 * sizeof(int),但是编译器如何在函数内部知道二维数组的完整大小为 3 * 4 * sizeof(int)?
-
It doesn't。请注意此处的错误消息:wandbox.org/permlink/45ANpp3tESh3Dkqg,您有一个额外的间接级别。
标签: c pointers multidimensional-array