c ++按值或指向函数语法的指针传递数组

时间:2017-12-21 14:26:02

标签: c++ arrays pointers reference

有人可以解释下面两个函数声明之间的区别吗?据我所知,aDecay()将一个指针作为参数,如果你有一个整数int a[5],你可以调用aDecay(a)aDecay(&a[0],因为数组会衰减为指针。 / p>

现在,如果我想致电pDecay(),我必须使用pDecay(&a)

pDecay如何强迫您使用&

void aDecay(int *p)
void pDecay(int (*p)[7])

6 个答案:

答案 0 :(得分:0)

使用普通a(或其等于&a[0]),您可以在数组中指向单个元素。单个元素的类型为int,因此指向它的指针必须为int*

如果你有一个指向实际数组的指针,就像你使用&a一样,你不再有指向单个int元素的指针,而是指向整个数组。数组的类型为int[5],指向它的指针为int(*)[5]

另请注意,在 情况下,您不会按值传递数组。您按值传递指针

答案 1 :(得分:0)

这不是指向函数语法的指针,它是指向数组语法的指针。

在第一个示例中,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);
}

Demo

答案 2 :(得分:0)

aDecay指向int int数组可以衰减为指向数组第一个元素的指针。

pDecay获取指向七个int s的数组的指针 数组不会隐式转换为指向自身的指针。

答案 3 :(得分:0)

传递p会将数组p转换为指针,而不是将其保持为数组(这称为数组衰减,因为数组衰减为指针)。

传递&p不会将p转换为指针,因为它会将指针转换为 p为通用指针,这不是一个很大的指针因为它实际上是一个指针。

为什么我们不想将p转换为指针,因为数组不是只是指针。如果您认为数组只是指针,请尝试将sizeof(myArray)sizeof(myPointer)进行比较。数组也嵌入了它的大小,而不仅仅是指向第一个元素的指针。

答案 4 :(得分:0)

  

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的数组。

答案 5 :(得分:0)

首先,你在问题中有一个误解:如果a是一个数组,a总是一个指向该数组的指针,即你做pDecay(a) - NOT {{ 1}}。现在,pDecay(&a)是一个解除引用操作,因此,如果您说[ ] - 您取消引用指向a[5] + 5 * a的指针。因此,bytes in memory occupied by the array's unita完全相同。 &a[0]a[5]是一样的。

回答你的问题,&(a + 5)接受一个指向整数的指针 - 这里没有要求数组。 aDecay(int *p)是一个包含7个整数的数组,编译器将检查是否存在这种情况。