sizeof(Array_Name)返回此数组的字节数,而当在用户定义的函数中使用它时,它会返回指针的大小(这是因为它被传递给函数作为指针)。
我的问题是,为什么当在main中使用sizeof(Array_Name)时,它不被视为指针?
答案 0 :(得分:0)
这是因为数组名称在传递给函数时会衰减为指针。例如
int main()
{
int arr[3] = { 1, 2, 3 };
printf("main: %zu\n", sizeof(arr));
f(arr);
}
void f(int *ptr)
{
printf("%zu", sizeof(ptr));
}
输出:
main: 3 * sizeof(int)
f: sizeof(int *)
(其中sizeof...
替换为编译器上的实际值)
此外,它不依赖于数组是否在main
中声明。此规则更通用:在声明数组的函数中,它被视为实际数组。只有当它作为参数传递给函数时,才会转换为指向第一个元素的指针。这就是为什么采用数组的函数会获取指向第一个元素的指针和一个size参数。
void print(const int *arr, size_t n)
{
size_t i;
for (i = 0; i < n; ++i)
printf("%d\n", arr[i];
}
答案 1 :(得分:0)
我有一种感觉,你有像char Array_Name [20];哪会回归&#39; 20&#39;从你声明它的函数中,然后你将它传递给另一个函数,它接受:void f(char * Array_Name){...},这里打印的值是4或8(char *的大小)。为了使这更容易理解,首先将函数中的参数重命名为void f(char * My_Pointer){...}。现在意识到&#39; sizeof&#39;在编译时解决,而不是在运行时解决。因此,在编译时,我们所知道的是My_Pointer指向一个字符数组,但可以用各种数组调用,所以评估(char *)的大小真的很有意义。