C ++在指向结构的指针中访问类数组指针

Posted

技术标签:

【中文标题】C ++在指向结构的指针中访问类数组指针【英文标题】:C++ accessing class array pointer in a pointer to a structure 【发布时间】:2019-12-02 19:20:39 【问题描述】:

我是 C++ 新手,我真的需要一些帮助。我正在尝试创建一个与 GSL Monte-Carlo 算法接口的结构(这对于本示例来说实际上并不重要)。我搜索了所有的 C++ 教程、*** 帖子和 GSL 文档,但没有成功。我正在使用犰狳包进行矩阵操作;它非常健壮。根据文档,我无法在结构中使用动态数组,因此我试图找到一种方法使我的结构变量 *M 指向我的数组 *L[] 中的值。我确信使用向量会更好,但 1) 其余代码(错误形式)已经使用指针,以及 2) 我将其视为一种学习体验。我很惊讶 *M 和 *L[] 的地址在我的代码中不一样。不那么重要的是,我对我的 std::cout 为每行打印不同数量的空格感到惊讶。代码在打印最后一个 std::cout 之前退出,如下面的输出所示。

感谢您的帮助!

#include "pch.h"
#include "stdio.h"
#include "complex"
#include "new"
#include "armadillo"
using namespace arma;

class Link

public:

    arma::Mat<cx_double>::fixed<3, 3>* dir[4];                                      // pointer to directional SU(3) matrices

    Link();                                                                         // default constructor

;

Link::Link()                                                                        // default constructor - all directional matrices are the identity 


    for (size_t hcount = 0; hcount < 4; hcount++)
    
        dir[hcount] = new arma::Mat<cx_double>::fixed<3, 3> fill::eye ;           // create directional matrix in direction hcount
    


struct Param

    Link* M;
;
int main()

    const int size  = 10;
    Param* Parameters = new Param NULL ;
    Link* L[size];
    arma::Mat<cx_double>::fixed<3, 3> One fill::eye ;


    for (size_t hcount = 0; hcount < 10; hcount++)
    
        L[hcount] = new Link();
        *L[hcount]->dir[1] = *L[hcount]->dir[1] + hcount * One;                     // Make each array element #1 unique
    

    Parameters->M = L[0];

    std::cout << "&L                        = " << &L << std::endl;
    std::cout << "&Parameters->M            = " << &Parameters->M << std::endl;                 // surprised that addresses are not the same
    std::cout << std::endl;

    std::cout << "&L[0]                     = " << &L[0] << std::endl;
    std::cout << "&Parameters->M[0]         = " << &Parameters->M[0] << std::endl;
    std::cout <<  std::endl;

    std::cout << "&L[5]                     = " << &L[5] << std::endl;
    std::cout << "&Parameters->M[5]         = " << &Parameters->M[5] << std::endl;
    std::cout << std::endl;

    std::cout << "&L[5]->dir[1]             = " << &L[5]->dir[1] << std::endl;
    std::cout << "&Parameters->M[5].dir[1]  = " << &Parameters->M[5].dir[1] << std::endl;
    std::cout << std::endl;

    std::cout << "*L[5]->dir[1]             = " << *L[5]->dir[1] << std::endl;                  // This works
    std::cout << "*Parameters->M[5].dir[1]  = " << *Parameters->M[5].dir[1] << std::endl;       // This does not
    std::cout << std::endl;


OUTPUT
&L                                              = 0024F7CC
&Parameters->M                  = 004EEFD8

&L[0]                                           = 0024F7CC
&Parameters->M[0]                       = 004E0578

&L[5]                                           = 0024F7E0
&Parameters->M[5]                       = 004E05C8

&L[5]->dir[1]                           = 004E50C4
&Parameters->M[5].dir[1]        = 004E05CC

*L[5]->dir[1]                           =     (+6.000e+00,+0.000e+00)                      (0,0)                      (0,0)
                      (0,0)    (+6.000e+00,+0.000e+00)                      (0,0)
                      (0,0)                      (0,0)    (+6.000e+00,+0.000e+00)

*Parameters->M[5].dir[1]        = 

【问题讨论】:

【参考方案1】:

&amp;LL 的地址,所以它是指向第一个元素的指针的地址,而不是第一个元素本身的地址。 &amp; Parameters-&gt;M 也一样。那是来自Parameters 的成员M 的地址。您想将L[0]Parameters-&gt;M 进行比较,除非M 不应指向L[0] 所指的元素,而是指向数组本身的开头,然后您想将其与L 进行比较。但是你也必须改变分配。

我觉得使用指针数组有点奇怪。只需使用Links 的数组即可。

【讨论】:

我想我理解您的评论,但我不确定如何进行必要的更改。 我想我理解您的评论,但我不确定如何进行必要的更改。您似乎在建议类似 " &( Parameters->M[0] ) = &L[0]; " 但当然这有错误的语法。你能建议一个编码解决方案吗?另外,我希望对 M 使用指针数组,因为 1)我的 L 数组确实很大(这是一个简化版本),2)在我的实际代码中,它的长度是动态定义的 认为你想要Parameters-&gt;M = L。然后Parameters-&gt;M[i] == L[i] 代表所有0 &lt;= i &lt; size Parameters->M = L 给出错误:“Link **”类型的值不能分配给“Link *”类型的实体。类似地,Parameters->M[i] = L[i] 上的循环产生错误:没有运算符 "=" 匹配这些操作数。我已经尝试了所有我能想到的变体,但没有任何效果。编译器几乎总是正确的,但在这种情况下我无法弄清楚。 解决了!在我的结构中,我声明了 Link *M[10]。然后我在Parameters->M[hcount] = L[hcount]上做了一个循环。现在 *L[5]->dir[1] 与 *Parameters->M[5]->dir[1] 相同,所有内存地址都应如此。感谢您指出正确的方向。

以上是关于C ++在指向结构的指针中访问类数组指针的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中声明指向结构的指针数组,但在需要之前不为结构分配内存

如何在C中释放指向结构的指针数组?

C:指向结构指针数组的指针(分配/解除分配问题)

在C ++中初始化一个指向结构的指针数组

为啥我不能访问指向数组中成员函数的指针?

C语言指向二维数组的指针