函数,返回指向int数组的指针
Function returning a pointer to an int array
我正在学习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 name
0,就可以访问(*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 array
0或刚好等于*(*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;
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”