相关疑难解决方法(0)

如何在C++中使用数组?

C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.

本FAQ分为五个部分:

  1. 类型级别的数组和访问元素
  2. 数组创建和初始化
  3. 赋值和参数传递
  4. 多维数组和指针数组
  5. 使用数组时常见的陷阱

如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.

在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用newdelete如下所示是非常危险的,但这是另一个常见问题解答的主题.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ arrays pointers c++-faq multidimensional-array

469
推荐指数
5
解决办法
12万
查看次数

如何将静态2D数组的指针传递给结构/类?

当我尝试将数组的指针(包含程序中某些函数所需的参数)传递给结构时,我遇到了问题,然后应该将结果传递给这些函数.例如,GSL希望我以这种方式传递参数.

一个小例子程序看起来像这样:

#include <iostream>

using namespace std;

struct myparams
{
    double  * a;
    double ** b;
};

int main()
{
    double c[10]   = {0,1,2,3,4,5,6,7,8,9};
    double d[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

    double** e = new double*[4];
    for (int i = 0; i < 4; i++) {
       e[i] = new double[3];
    }

    myparams params;

    // THIS WORKS:
    params.a = c;
    for (int i = 0; i < 10; i++) {
        cout << params.a[i] << endl;
    }

    // THIS DOESN'T WORK
    params.b = d;

    // …
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
2
解决办法
5754
查看次数

C++动态/静态数组作为函数的参数

我一直在尝试使用2D数组作为我的C++类中的构造函数的参数.

标题:

Matrix::Matrix(double **initComponents, int rows, int columns)
Run Code Online (Sandbox Code Playgroud)

如果我只是继续定期调用new和初始化子数组,将指针传递给构造函数,它的一切都很好但是我想,我可以用初始化器创建静态2D数组并将指针传递给构造函数?

double A[][3] = { {2.0, 3.0, 4.0} , {1.0, 3.0, 4.0} , {2.0, 3.0, 4.0} }; 
Matrix *mtx = new Matrix(A, 3, 3);
Run Code Online (Sandbox Code Playgroud)

这不起作用:(

MS Visual Studio编译器:

" error C2664: 'Matrix::Matrix(double **,int,int)' : cannot convert parameter 1 from 'double [3][3]' to 'double ** "
Run Code Online (Sandbox Code Playgroud)

有谁能解释为什么?我以为它会在引用和指针之间进行自动转换.

第二个问题是,为什么我只能声明A为double A[][],为什么我必须指定第二个维度,即使我指定了所有值.

c++ arrays parameters

1
推荐指数
1
解决办法
2798
查看次数