数组的C大小与作为函数参数的指针表示法的比较



在C中,我可以用两种不同的方式编写函数声明(我被告知这两种方式完全相同(

void test (int *arr);
void test (int arr[]);

但为什么我们每个人都需要使用第一个呢?我的意思是,后者允许我们使用sizeof()来获得数组中的元素数量——这在第一种方法中是不可能的。

我的意思是,后者允许我们使用sizeof()来获取数组中的元素数量,这在第一种方法中是不可能的。

不,后者也不可能。这是你的一个误解。这两种符号作为函数参数是绝对等价的,表示一个指针。arr[]既不表示数组,也不显式地表示指向数组的指针

看看这里:

C指针表示法与数组表示法的比较:传递给函数时

如果在数组可见的范围内的数组名称本身使用sizeof(),或者向函数传递另一个参数/参数,该函数包含有关上次使用sizeof()时数组大小的信息,则只能获取数组的大小。

无论是在声明数组的函数中,还是在另一个函数中,都不能在指向数组的指针处使用sizeof()来获取数组大小。

但为什么我们都需要使用第一个呢?

简单地象征它是一个指针,而不是一个数组,因为这种混淆实际上已经把你带到了这里。:-(

我的意思是,后者允许我们使用sizeof((来获取数组中的元素数量,这在第一种方法中是不可能的。

这句话是错误的。事实上,这两个版本完全相同。函数不知道数组的大小,并且不能使用sizeof来获取数组的大小。相反,您将只获得传递的数组衰减到的指针的大小。

我的意思是后者允许我们获得数组中的元素数量使用sizeof((

不,这根本不是关于函数的正确信息。在将数组传递给以数组为参数的函数后,数组衰减为指针,从而产生类型的指针类型的大小,而不是类型本身的大小

例如,对于int类型,

sizeof int
sizeof *int