这是下面的代码来说明问题:
#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)
尽管用于其定义的语法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是指针,则将其大小除以它指向的类型的大小,但是没有用,就像你的表达式一样.
在函数中声明数组参数时,它根本不是数组,而是指针。
声明
void funct(int arr[]);
Run Code Online (Sandbox Code Playgroud)
实际上等于
void funct(int *arr);
Run Code Online (Sandbox Code Playgroud)
这就是您看到的结果之间的差异。在main函数中&arr是指向数组的指针,但在func表达式中&arr是指向指针变量的指针。这两个指针是非常不同的。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |