函数,返回指向int数组的指针

Function returning a pointer to an int array

本文关键字:数组 指针 int 返回 函数      更新时间:2023-10-16

我正在学习Primer第5版的C++,我正在返回指向数组的指针。此函数的声明为:

 int (*func(int i))[10]; 

并且期望它返回一个指向数组的指针。

我写了这样的代码:

#include <iostream>
#include <string>
using namespace std;
int *func(){
  static int a[]={1,2,3};
  return a;
}
int main (){
  int *p=func();
  for(int i=0;i!=3;++i){
    cout<<*(p+i);
  }
}

它正在发挥作用。但我想知道我在这里做的和之间的区别

  int (*func(int i))[10]; 

我如何使这个函数调用工作,因为在书中,没有任何具体的例子。

阅读:sizeof(&array)返回什么?以了解CCD_ 1与CCD_。

Q1我想知道之间的区别

在您的代码中:

  int *func(){
    static int a[]={1,2,3};
    return a;
  }

您正在返回第一个元素的地址。实际上a的类型是衰变为int*int[3]。重要的是
您将地址存储到int* p中,并可以将数组的元素评估为p[i]

而如果你的函数是int int (*func())[3],那么你返回&a,并赋值给array name0,就可以访问(*p)[i]
注:&a的类型为int(*)[3]

Q2我如何让这个函数调用工作,因为在书中没有任何具体的例子。

类似:

int (*func())[3]{
    static int a[]={1,2,3};
    return &a;
}

And main():

int main(){ 
 int i=0;    
 int(*p)[3] = func();
 for(i=0; i<3; i++)
   printf(" %dn", (*p)[i]);
 return 0;
}

您可以检查第二版本的代码工作id Ideone

Q1我想知道之间的区别

由于您有兴趣了解两者之间的差异,因此现在比较两个版本的代码中p的两种不同声明:

1):int* p;,我们将数组元素访问为等于*(p + i)p[i]

2):int (*p)[i],并且我们将数组元素访问为等于address of array0或刚好等于*(*p + i)(*p)[i]。(我在*p周围添加了()来访问数组元素,因为[]运算符的优先级高于*,所以简单的*p[i]意味着对数组元素的防御)。

编辑:

除返回类型之外的附加信息:

在这两种函数中,我们都返回静态变量(数组)的地址,而静态对象的寿命是直到程序没有终止。因此,访问超大func()阵列不是问题。

考虑一下,如果您返回的简单数组(或变量)的地址不是静态的(并且是动态分配的),那么它会在代码中引入可能崩溃的未定义行为。

int(*)[10]是指向10个int s的数组的指针。int*是指向int的指针。这些是不同的类型。

然而,数组会衰减到指向其第一个元素的指针,因此您可以执行以下操作:

int a[10];
int(*p)[10] = &a;
int* q = a; // decay of int[10] to int*

但不是:

q = p;
p = q;