为什么指针在C中找不到数组的大小,在被调用的函数中使用时给出不同的值

Abh*_*osh 5 c arrays function

这是下面的代码来说明问题:

#include <stdio.h>

void func(int arr[]);

int main() {
    int arr[10];
    int n = *(&arr + 1) - arr;
    printf("%d\n", n);
    func(arr);
    return 0;
}

void func(int arr[]) {
    int n = *(&arr + 1) - arr;
    printf("%d\n", n);
}
Run Code Online (Sandbox Code Playgroud)

上述代码的输出是:

10
268435906
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 7

尽管用于其定义的语法void func(int arr[]),函数func接收指向数组的第一个元素的指针.定义更清晰void func(int *arr).

表达*(&arr+1)-arr在编译时的计算结果为阵列的元素的数量如果arr被定义为一个阵列.如果arr是指针,它会在指针之后取消引用内存并减去指针值,这是没有意义的,并且在大多数情况下具有未定义的行为.

获取数组元素数的更常见(也更易读)的表达式是

n = sizeof(arr) / sizeof(*arr);
Run Code Online (Sandbox Code Playgroud)

如果arr是数组,则将其大小(以字节为单位)除以元素的大小(以字节为单位),即可生成元素数.表达式在编译时计算,没有运行时开销.如果arr是指针,则将其大小除以它指向的类型的大小,但是没有用,就像你的表达式一样.


Som*_*ude 5

在函数中声明数组参数时,它根本不是数组,而是指针

声明

void funct(int arr[]);
Run Code Online (Sandbox Code Playgroud)

实际上等于

void funct(int *arr);
Run Code Online (Sandbox Code Playgroud)

这就是您看到的结果之间的差异。在main函数中&arr是指向数组的指针,但在func表达式中&arr是指向指针变量指针。这两个指针是非常不同的。