如何从函数返回数据类型 int** 并存储它?
Posted
技术标签:
【中文标题】如何从函数返回数据类型 int** 并存储它?【英文标题】:How to return data type int** from a fuction and store it? 【发布时间】:2021-03-16 15:43:58 【问题描述】:我编写了一个使用 Loubere 算法求解幻方的代码。我已经为这个算法创建了一个函数,我想使用 int** 返回一个值,但是我应该怎么做,因为我在函数体中使用了 2D 数组,我应该如何将它存储在 main() 函数中
#include <iostream>
#include <cstdlib>
using namespace std ;
int ** magicSquare ( int size )
int number;
int sq=size*size;enter code here
int mid=size/2;
//for array
int m=0;
//rows
int n=mid; //columns
array[m][n]=n;
for(number=1; number<=sq; number++)
n++;
n=n-1;
m=m+1;
if(n==-1)
n=3;
if(m==3)
m=0;
if (array[n][m] !=0)
n++;
array[n][m]=number;
int* array_rows[size]=array[size][size];
int** p=array_rows;
return p;
int main()
int dimension;
cout<<"Enter dimension of the magic square : "; cin>>dimension;
magicSquare ( dimension );
【问题讨论】:
返回std::vector<std::vector<int>>
而不是 int**
。
你需要正确缩进你的代码。
这行array[m][n]=n;
你打算做什么?
你需要先分配一个数组
“返回二维数组”和“返回int**
”是有区别的。您想要前者,但您的代码执行后者。指针不是数组
【参考方案1】:
按照建议,您可以使用std::vector<std::vector<int>>
来存储您的数据并正确返回。像这样的:
#include <vector>
#include <iostream>
using square = std::vector<std::vector<int>>;
square makeMagicSquare(size_t size)
square magicSquare(size, std::vector(size, 0));
// <-- Your code here
// magicSquare[i][j] = ...;
return magicSquare;
int main()
square sq = makeMagicSquare(10);
// Print it
for (auto& row: sq)
for (auto& cell: row)
std::cout << cell << ' ';
std::cout << '\n';
【讨论】:
【参考方案2】:如果要将其存储为数组,则需要更改方法以返回 int[][]
而不是 int**
。它们的工作方式非常相似,但指针和数组之间存在区别。
您可以完全按照您的预期将其存储为int[][]
。存储幻方如下:
int[][] magicSquare = magicSquare(dimension);
这会将您的方法的返回值分配给一个二维数组,然后您必须在程序结束时释放该数组。
请记住,数组的工作方式是给出数据块头部的地址。当您返回一个数组时,即使它是int[][]
,您也正在引用一个数据块的地址。在这种情况下,它是一个 int
数组块。为了以后访问它,您需要先分配该内存块,然后才能对其进行任何操作。这意味着在您的magicSquare()
方法中,您将需要创建一个包含信息的int[][]
,并且您可以将其传递给int[][]
。
免责声明:您绝对可以使用指针来执行此操作,但使用std::vector<std::vector<int>>
会更容易且不太可能导致错误。使用std::vector
,您不必分配或释放内存,它可以处理潜在的未定义行为,例如读取数据块的末尾。
【讨论】:
以上是关于如何从函数返回数据类型 int** 并存储它?的主要内容,如果未能解决你的问题,请参考以下文章