输入指针指向的函数
Function with input of pointer to pointer to
我看到这个关于 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。
但是
是不是下一个 printf 会让我得到指向他的大小也将是 8 的指针的不同指针?
所以我认为这会导致
8 8 8 1
实际输出是
8 600 30 1
在此声明中
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]);
并声明同一个函数。
第一个就是你说的指针的大小,所以8;最后一个是一个字符的大小,所以1;第二个是 sizeof(char)*30*20,因为您已经取消引用数组的第一个 "dimension",所以您正在查看该维度的 10 个元素之一中包含的内容。第三个是 sizeof(char)*30 因为你正在查看第二维的元素。
首先你需要知道 sizeof
是一个运算符而不是一个函数。当数组是 sizeof
或一元 &
运算符的操作数时,数组不会转换为指向其第一个元素的指针。
在函数 checkSizes
中,参数 matrix3d
的类型 指向一个由 20 个 30 char
s 数组组成的数组。由于它是一个指针,语句
printf ("%lu\t", sizeof(matrix3d));
将打印指针的大小。
取消引用指针 matrix3d
将给出它的第一个元素。它的第一个元素是一个由 20 个数组组成的 数组,每组 30 char
s。 sizeof(*matrix3d)
将 return 数组大小 char[20][30]
,即 600 字节。 sizeof(*matrix3d)
等同于 sizeof(matrix3d[0])
。
**matrix3d
的类型是一个 30 char
的数组,sizeof(**matrix3d)
将打印 30 个字节。
***matrix3d
的类型是achar
,sizeof(***matrix3d)
会打印1个字节。
我看到这个关于 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。
但是 是不是下一个 printf 会让我得到指向他的大小也将是 8 的指针的不同指针?
所以我认为这会导致
8 8 8 1
实际输出是
8 600 30 1
在此声明中
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]);
并声明同一个函数。
第一个就是你说的指针的大小,所以8;最后一个是一个字符的大小,所以1;第二个是 sizeof(char)*30*20,因为您已经取消引用数组的第一个 "dimension",所以您正在查看该维度的 10 个元素之一中包含的内容。第三个是 sizeof(char)*30 因为你正在查看第二维的元素。
首先你需要知道 sizeof
是一个运算符而不是一个函数。当数组是 sizeof
或一元 &
运算符的操作数时,数组不会转换为指向其第一个元素的指针。
在函数 checkSizes
中,参数 matrix3d
的类型 指向一个由 20 个 30 char
s 数组组成的数组。由于它是一个指针,语句
printf ("%lu\t", sizeof(matrix3d));
将打印指针的大小。
取消引用指针 matrix3d
将给出它的第一个元素。它的第一个元素是一个由 20 个数组组成的 数组,每组 30 char
s。 sizeof(*matrix3d)
将 return 数组大小 char[20][30]
,即 600 字节。 sizeof(*matrix3d)
等同于 sizeof(matrix3d[0])
。
**matrix3d
的类型是一个 30 char
的数组,sizeof(**matrix3d)
将打印 30 个字节。
***matrix3d
的类型是achar
,sizeof(***matrix3d)
会打印1个字节。