c ++按值或指向函数语法的指针传递数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c ++按值或指向函数语法的指针传递数组相关的知识,希望对你有一定的参考价值。
有人可以解释下面这两个函数声明之间的区别吗?据我所知,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
s的数组。
数组不会隐式转换为指向自身的指针。
传递p
会将数组p
转换为指针而不是将其保持为数组(这称为数组衰减,因为数组衰减为指针)。
传递&p
不会将p
转换为指针,因为它会将指针转换为p
为通用指针,这不是什么大问题,因为它实际上是一个指针。
为什么我们不想将p
转换为指针是因为数组不仅仅是指针。如果您认为数组只是指针,请尝试将sizeof(myArray)
与sizeof(myPointer)
进行比较。数组也嵌入了它的大小,而不仅仅是指向第一个元素的指针。
首先,你在这个问题上有一个误解:如果a
是一个数组,a
总是指向那个数组的指针,即你做pDecay(a)
- NOT 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个整数的数组,编译器将检查是否存在这种情况。
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
的数组。
以上是关于c ++按值或指向函数语法的指针传递数组的主要内容,如果未能解决你的问题,请参考以下文章