用户定义函数

时间:2016-08-08 13:23:49

标签: c arrays function pointers

在side main函数中使用时,

sizeof(Array_Name)返回此数组的字节数,而当在用户定义的函数中使用它时,它会返回指针的大小(这是因为它被传递给函数作为指针)。

我的问题是,为什么当在main中使用sizeof(Array_Name)时,它不被视为指针?

2 个答案:

答案 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 *)的大小真的很有意义。

相关问题