C:二维数组的 Sizeof - 指针和第一个元素之间的区别

C: Sizeof of 2D-array - difference between pointer and first element

我在 C 中有一个类似于以下二维数组的数组:

uint16_t myArray[2][14] = {
                    { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
                    { 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114} 
                };

我想获取数组的大小并使用了:

printf("size: %d \n", sizeof(myArray) / sizeof( * myArray));

结果

size: 2

当我使用第一个子数组的第一个元素时

printf("size: %d \n", sizeof(myArray) / sizeof(myArray[0][0]));

...我得到了正确的结果:

size: 28

这是因为我用 2 个子数组初始化数组还是有其他解释?

当你使用这个得到数组的长度时:

printf("size: %d \n", sizeof(myArray) / sizeof( * myArray));

您正在获取数组的大小,然后将其除以第一个元素的大小,而第一个元素又是另一个数组。因为它里面还有另一个数组,其长度在变量声明中描述,所以它将获得数组的大小而不是 *uint16_t。实际上,你得到了整个数组分配的内存量,然后将它除以数组内部分配的内存量的大小,因为只有两个元素,所以是 2.

Whole 2D array (28 * sizeof(uint16_t)): 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114

1D array inside 2D (14 * sizeof(uint16_t)): 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014

当使用里面元素的大小时,你是将28 * sizeof(uint16_t)除以14 * sizeof(uint16_t),即2。但是,当使用里面元素的大小时,你是将[=14]除=] 通过 sizeof(uint16_t),即 28.

希望这是有道理的:)