如何创建一个点变量来完成数组(不是第一个元素示例:int *ptr = &arr,而不是int *ptr = arr)



我想使用&arr指向完整的arr而不仅仅是第一个元素这一事实来计算像这样的数组长度

int size = *(&arr + 1) - arr ;

现在这将在主函数中工作,但我想计算一个函数中的大小,其中没有定义数组,并将arr作为参数。

由于arr在传递到函数中时衰减为指针。sizeof(arr)/sizeof(arr[0])方法不起作用,因为它意味着

sizeof(int*) / sizeof(int) 
// i.e. 4/4 = 1.

我想在函数中使用&arr方法,但由于某种原因,它不起作用。。。这就是为什么我想将CCD_ 7作为函数内部的参数传递。我试着简单地通过将&arr作为参数来传递它,但我很困惑&arr的数据类型是什么,正如它所说的那样。

expected 'int *' but argument is of type 'int (*)[4]'

这很好,因为我只通过int(*)[4],但如何指定这个内部函数参数?

。。。计算未定义数组的函数中的大小,并将arr作为参数。

在C中,当可变长度数组可用时:

#include <stdio.h>
#include <stdint.h>
// The array is not defined here.
//                            v
void bar(size_t n, int (*arg)[n]) {
// Size of the array from main() is calculated here.
size_t size = sizeof *arg / sizeof *arg[0];
printf("%p %zun", (void*) arg, size);
// Akin to OP's calculation method
ptrdiff_t diff = *(arg + 1) - *arg;
printf("%p %tdn", (void*) arg, diff);
printf("%p %zun", (void*) arg, n);
}
int main(void) {
// Array defined here.
int arr[42];
int size = *(&arr + 1) - arr ;
printf("Main: %dn", size);
size_t sz = sizeof arr / sizeof arr[0];
bar(sz, &arr);
return 0;
}

输出

Main: 42
0xffffcb40 42
0xffffcb40 42
0xffffcb40 42

在C++中传递对数组的引用的语法为:

template <typename T, std::size_t N>
std::size_t size(const T (&a)[N])
{
return N;
}

对于C,您没有模板来推断大小,所以类型/大小将被硬编码:

void foo(const int (*arr)[42])
{
// ...
}