指向

时间:2016-09-01 13:09:27

标签: c pointers sizeof

我看到了关于sizeof()结果的这个问题,我并不理解这个函数的输出。

#include <stdio.h>
void checkSizes(char matrix3d[10][20][30])
{
    printf ("%lu\t", sizeof(matrix3d));
    printf ("%lu\t", sizeof(*matrix3d));
    printf ("%lu\t", sizeof(**matrix3d));
    printf ("%lu\t", sizeof(***matrix3d));
}
int main()
{
    char matrix[10][20][30];
    checkSizes(matrix);
}

正如我所假设的,当一个函数得到一个数组可以使用时,它会得到一个指向数组的指针,所以当我打印第一行

printf ("%lu\n", sizeof(matrix3d));

输出为8.

BUT 是不是下一个printf会让我指向指针的不同指针,他的大小也是8?

所以我这将导致

8    8    8    1

实际输出是

8    600    30   1

3 个答案:

答案 0 :(得分:2)

在本声明中

printf ("%lu\t", sizeof(*matrix3d));
// it is better to use "%zu\t"

表达式*matrix3d的类型为char[20][30]

sizeof运算符中使用数组作为表达式不会将表达式转换为指向数组第一个元素的指针。

因此,您将获得输出600

但是如果你要写

sizeof( *matrix3d + 0)

然后确实*matrix3d类型char[20][30]将在表达式*matrix3d + 0中隐式转换为类型char ( * )[30]的指针,相应的printf语句将输出8 ,

对于函数参数及其参数,它们被隐式转换为类型char ( * )[20][30]

所以例如这些函数声明是等价的

void checkSizes(char matrix3d[10][20][30]);
void checkSizes(char ( *matrix3d )[20][30]);

并声明相同的一个函数。

答案 1 :(得分:1)

首先,你需要知道sizeof是一个运算符,而不是一个函数。当数组是sizeof或一元&运算符的操作数时,数组不会转换为指向其第一个元素的指针。

在函数checkSizes中,参数matrix3d的类型为,指向包含30个char s 的20个数组的数组。因为它是一个指针,语句

printf ("%lu\t", sizeof(matrix3d));  

将打印指针的大小 取消引用指针matrix3d将给出其第一个元素。它的第一个元素是一个由20个char s 组成的20个数组的数组。 sizeof(*matrix3d)将返回数组char[20][30]的大小,即600字节。 sizeof(*matrix3d)相当于sizeof(matrix3d[0])

**matrix3d的类型 30个char s 的数组,sizeof(**matrix3d)将打印30个字节。
***matrix3d的类型为 a char sizeof(***matrix3d)将打印1个字节。

答案 2 :(得分:0)

第一个是,正如你所说的指针的大小,所以8;最后一个是角色的大小,所以1;第二个是sizeof(char)* 30 * 20,因为你已经取消引用了第一个&#34;维度&#34;对于数组,您正在查看该维度的10个元素之一中包含的内容。第三个是sizeof(char)* 30,因为你正在查看第二个维度的元素。