我正在从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];
我如何使这个函数调用工作,因为在书中,没有任何具体的例子。
答案 0 :(得分:3)
阅读:What does sizeof(&array) return?了解array name
和address 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;