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

时间:2013-07-26 13:04:17

标签: c++ c pointers function-pointers

我正在从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]; 

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

2 个答案:

答案 0 :(得分:3)

阅读:What does sizeof(&array) return?了解array nameaddress of array之间的差异。

  

Q1 我想知道:

之间的区别

在您的代码中:

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

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

如果您的函数是int int (*func())[3],那么您返回&a,并分配给int(*p)[3]并可以访问(*p)[i]
注意:&a的类型为int(*)[3]

  

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

喜欢:

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

和main():

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

您可以查看工作ID为Ideone

的第二版代码
  

Q1 我想知道:

之间的区别

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

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

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

修改:

除了返回类型之外的其他信息:

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

考虑是否返回非静态(并动态分配)的简单数组(或变量)的地址,然后在代码中引入可能崩溃的未定义行为。

答案 1 :(得分:2)

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

但是,数组衰减到指向其第一个元素的指针,因此您可以这样做:

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

但不是:

q = p;
p = q;