C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.
本FAQ分为五个部分:
如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.
在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用new和delete如下所示是非常危险的,但这是另一个常见问题解答的主题.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我有一个如下所示的程序:
double[4][4] startMatrix;
double[4][4] inverseMatrix;
initialize(startMatrix) //this puts the information I want in startMatrix
Run Code Online (Sandbox Code Playgroud)
我现在想要计算startMatrix的反转并将其放入inverseMatrix.我有一个用于此目的的库函数,其原型如下:
void MatrixInversion(double** A, int order, double** B)
Run Code Online (Sandbox Code Playgroud)
取A的倒数并将其放入B.问题是我需要知道如何将double [4] [4]转换为双**以赋予函数.我尝试过"明显的方式":
MatrixInversion((double**)startMatrix, 4, (double**)inverseMatrix))
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.这实际上是正确的方法吗?
我的程序中有这样的矩阵:
double m[3][4] =
{
{2, 4, 5, 7},
{4, 5, 1, 12},
{9, 12, 13, -4}
};
Run Code Online (Sandbox Code Playgroud)
而且我想把它投入到double**打字中.
我已经尝试过简单double** a = (double**)m;,但它不起作用(当我尝试读取任何值时,我得到"访问冲突读取位置0x00000000.",这意味着我正试图从NULL地址读取.
我找到了几乎可行的解
double *b = &m[0][0];
double **c = &b;
Run Code Online (Sandbox Code Playgroud)
当我读取字段时它工作c[0][any]
但是当我尝试从字段读取值时,会出现相同的NULL地址读取问题c[1][0].
将double m[3][4]数组转换为键入的正确方法是什么double**?
编辑:你说这是不可能的.所以我会稍微改变一个问题.如何将二维双数组作为参数传递给函数?我的功能有原型:
void calculate(double **matrix, int n); //where matrix size is always n by n+1
Run Code Online (Sandbox Code Playgroud)
它在动态分配的数组中运行良好.我怀疑只有它的工作方式是分配新的动态数组并将原始静态数组复制一个元素......
我有以下来源:
#include <iostream>
using namespace std;
void main(int j)
{
char arr[10][10];
char** ptr;
ptr = arr;
}
Run Code Online (Sandbox Code Playgroud)
当我使用VS2010编译它时,我收到此错误:
error : a value of type "char (*)[10]" cannot be assigned to an entity of type "char **"
Run Code Online (Sandbox Code Playgroud)
我认为c ++中的数组只是指针.所以char[][]也可以char**.我究竟做错了什么?
如何将二维数组分配给**指针?这就是我想做的事情
int arrray [2][3];
int **pointer = array;
so pointer[0][1]= 1;
Run Code Online (Sandbox Code Playgroud)
所以任何帮助?提前致谢
可能重复:
通过指针传递二维数组
int table[20][20];
int** table1 = table;
int a;
table[0][0] = 4;
a = table1[0][0];
Run Code Online (Sandbox Code Playgroud)
最后一行给了我访问冲突,我不明白..
提前致谢!
我搜索了stackoverflow并看到了我的问题中的每个单词组合,但不是我的问题.
我有一个int数组,它恰好是一个2d数组.
const int themap[something][something] = { {0, ...
Run Code Online (Sandbox Code Playgroud)
我有一个结构,我希望在我的程序中有一个指向这个数组的指针
typedef struct {
int** mymap;
} THE_STRUCT
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我想通过struct的指针迭代数组的值,但是如果我尝试通过它访问它,我的数据似乎已损坏.句法
int value;
THE_STRUCT mystruct;
mystruct = (int**) themap;
...
//access the map data from mystruct's pointer?
value = mystruct.mymap[x][y];
//doesn't seem to return correct values
Run Code Online (Sandbox Code Playgroud)
如果我直接使用数组(作为全局变量),那么从图片中取出结构可以使用相同的函数
int value;
...
//access the map directly
value = themap[x][y]
//everyone is happy!
Run Code Online (Sandbox Code Playgroud)
我想使用结构实际上它将携带其他信息以及我需要能够将指针分配给具有不同数据的其他数组的事实.
下面是我试图运行的代码
#include <iostream>
using namespace std;
int foo(int **a){
cout<<*(a+3)<<endl;
return 1;
}
int main(){
int a[2][2] = {{1,2},{3,4}};
std::cout << sizeof(a);
foo((int **)a);
}
Run Code Online (Sandbox Code Playgroud)
当我在这个数组中有四个元素时,值*(a + 3)不应返回值4,而不是返回一个地址,当我尝试取消引用该地址时(即**(a + 3))我得到了段错11
我正在尝试编写通用矩阵转置函数
void reverse(int** v , int vertexes )
{
for(int i=0;i<vertexes;i++)
for(int j=0;j<vertexes;j++)
{
if(v[i][j] == 1 && v[j][i]==0){
v[j][i] = -1;
v[i][j] = 0;
}
}
for(int i=0;i<vertexes;i++)
for(int j=0;j<vertexes;j++)
{
if(v[i][j] == -1 )
v[i][j] = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
而主要功能是
void matrix_graph::process()
{
int v[7][7] = {
{0,1,0,0,0,0,0},
{0,0,1,1,0,0,0},
{1,0,0,0,0,0,0},
{0,0,0,0,1,0,0},
{0,0,0,0,0,1,0},
{0,0,0,1,0,0,1},
{0,0,0,0,0,1,0}
};
reverse(v,7);
}
Run Code Online (Sandbox Code Playgroud)
我按预期得到了一个
error C2664: 'reverse' : cannot convert parameter 1 from 'int [7][7]' to 'int **'
Run Code Online (Sandbox Code Playgroud)
我们能做些什么吗?
我们可以做的最好的访问i,j传递 …
我用C++编写了一段代码.我从搜索引擎结果中获取了第一部分.
1)使用函数定义函数的含义是什么double **filter_2d?我们可以使用指针定义函数吗?
2)我对以下行感到困惑:
double **filt_out = filter_2d(A, 3, 3, B, 2, 1);
Run Code Online (Sandbox Code Playgroud)
它工作不正常,我不明白为什么.
#include <iostream>
#include <stddef.h>
#include <cmath>
#include <fftw3.h>
using namespace std;
void filter_2d(double** image, int width_image, int height_image, double** kernel, int width_kernel, int height_kernel, double *** OutImg)
{
double **output = *OutImg;
int i, j, p, q;
//this is the case of 'full' option selected in matlab
//double **output = (double **)malloc(sizeof(double *)*(width_image + width_kernel - 1));
for (i = 0; i<width_image + width_kernel …Run Code Online (Sandbox Code Playgroud)