在C中,我可以用两种不同的方式编写函数声明(我被告知这两种方式完全相同(
void test (int *arr);
void test (int arr[]);
但为什么我们每个人都需要使用第一个呢?我的意思是,后者允许我们使用sizeof()
来获得数组中的元素数量——这在第一种方法中是不可能的。
我的意思是,后者允许我们使用
sizeof()
来获取数组中的元素数量,这在第一种方法中是不可能的。
不,后者也不可能。这是你的一个误解。这两种符号作为函数参数是绝对等价的,表示一个指针。arr[]
既不表示数组,也不显式地表示指向数组的指针。
看看这里:
C指针表示法与数组表示法的比较:传递给函数时
如果在数组可见的范围内的数组名称本身使用sizeof()
,或者向函数传递另一个参数/参数,该函数包含有关上次使用sizeof()
时数组大小的信息,则只能获取数组的大小。
无论是在声明数组的函数中,还是在另一个函数中,都不能在指向数组的指针处使用sizeof()
来获取数组大小。
但为什么我们都需要使用第一个呢?
简单地象征它是一个指针,而不是一个数组,因为这种混淆实际上已经把你带到了这里。:-(
我的意思是,后者允许我们使用sizeof((来获取数组中的元素数量,这在第一种方法中是不可能的。
这句话是错误的。事实上,这两个版本完全相同。函数不知道数组的大小,并且不能使用sizeof
来获取数组的大小。相反,您将只获得传递的数组衰减到的指针的大小。
我的意思是后者允许我们获得数组中的元素数量使用sizeof((
不,这根本不是关于函数的正确信息。在将数组传递给以数组为参数的函数后,数组衰减为指针,从而产生类型的指针类型的大小,而不是类型本身的大小
例如,对于int
类型,
sizeof int
sizeof *int