[英]c++ pass array by value or pointer to function syntax
有人可以在下面解释这两个函数声明之间的区别吗? 据我所知, aDecay()
将指针作为参数,如果您有整数int a[5]
,则可以调用aDecay(a)
或aDecay(&a[0]
因为数组会衰减为指针。
现在,如果要调用pDecay()
,则必须使用pDecay(&a)
。
pDecay如何迫使您使用&
。
void aDecay(int *p)
void pDecay(int (*p)[7])
使用普通a
(或等于&a[0]
),您将拥有一个指向数组中单个元素的指针。 单个元素的类型为int
,因此指向它的指针必须为int*
。
如果您有一个指向实际数组的指针(如与&a
,则不再有指向单个int
元素的指针,而是指向整个数组的指针。 数组的类型是int[5]
,指向它的指针是int(*)[5]
。
还要注意,在任何情况下都不会按值传递数组 。 您通过值传递指针 。
这不是指向函数语法的指针,而是指向数组语法的指针。
在第一个示例中, p
是指向整数数组的指针。 p[i]
是单个int
。 无法再对其进行索引。
在第二个示例中, p
是指向七个整数数组的数组的指针。 p[i]
是可以进一步索引的数组,即p[i][0]
有效。
这是使用第二种方法的示例:
void fill_data(int (*p)[7], size_t n) {
for (size_t i = 0 ; i != n ; i++) {
for (size_t j = 0 ; j != 7 ; j++) {
p[i][j] = (int)(7*i+j);
}
}
}
int main() {
int data[10][7];
fill_data(data, 10);
}
aDecay
一个指向int
的指针。
一个int
数组可以衰减为该数组第一个元素的指针。
pDecay
一个指向七个int
数组的指针。
数组不会隐式转换为指向自身的指针。
传递p
会将数组p
转换为指针,而不是将其保留为数组(这称为数组衰减,因为数组会衰减为指针)。
传递&p
不会转换p
为指针,因为这将指针转换为 p
到一个通用的指针,它是不是一个大问题,因为它实际上是一个指针。
为什么我们不想将p
转换为指针,是因为数组不仅仅是指针。 如果您认为数组只是指针,请尝试将sizeof(myArray)
与sizeof(myPointer)
。 数组还嵌入其大小,而不仅是指向第一个元素的指针。
pDecay
如何迫使您使用&
。
因为数组不会仅衰减到任何指针。 具体来说,它衰减到指向第一个元素的指针。 指向int
数组(即int[n]
)的第一个元素的指针的类型是:指向int
指针(即int*
)。
pDecay
的参数是int (*p)[7]
,它是一个指向7 int
数组的指针。 int*
不能隐式转换为(int (*p)[7]
;它们是单独的,不兼容的类型。请注意, pDecay(&a)
也不起作用,因为&a
的类型是(int (*p)[5]
类型也不同于(int (*p)[7]
。
pDecay
不会强迫您使用&
。 您可以传递一个数组数组,然后将其衰减到指向第一个数组的指针,这是pDecay
接受的:
int arr[n][7];
pDecay(arr);
有人可以在下面解释这两个函数声明之间的区别吗?
int*
是一个指向int
对象的指针。 int (*p)[7]
是指向int[7]
对象的指针,即7 int
的数组。
首先,您在这个问题上有一个误解:如果a
是一个数组,则a
始终是指向该数组的指针,即执行pDecay(a)
pDecay(&a)
。 现在, [ ]
是一个解引用操作,所以如果你说a[5]
-取消引用指针到a
+ 5 * bytes in memory occupied by the array's unit
。 因此, a
和&a[0]
完全相同。 a[5]
和&(a + 5)
相同。
回答您的问题, aDecay(int *p)
需要一个指向整数的指针-此处没有要求数组的东西。 int (*p)[7]
是7个整数的数组,编译器将检查是否是这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.