代码之家  ›  专栏  ›  技术社区  ›  HiroIshida

获取结构成员的指针后无法正确访问

  •  0
  • HiroIshida  · 技术社区  · 4 年前

    在下面的示例中,我基本上尝试获取数据中向量元素的指针。对我来说,这三种方法似乎是一样的,但结果却不同:

    123
    9.88131e-324
    5.61658e+259
    

    只有通过第一个方法,元素才能被正确访问。你能指出我的错误并解释一下为什么这三种方法是不同的?

    #include<vector>
    #include<iostream>
    using namespace std;
    
    struct Data
    {
      vector<double> a;
      Data() : a(vector<double>(100, 123.0)) {};
      double* get_ptr(int idx){
        return &a[idx];
      }
      void get_ptr2(int idx, double* ptr){
        ptr = &a[idx];
      }
    };
    
    int main(){
      auto data = Data();
      std::cout << *(data.get_ptr(10)) << std::endl; 
    
      double value;
      data.get_ptr2(10, &value);
      std::cout << value << std::endl; 
    
      double* ptr;
      data.get_ptr2(10, ptr);
      std::cout << *ptr << std::endl; 
    }
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   David C. Rankin    4 年前

    你面临的主要问题 get_ptr2 ,例如:

      void get_ptr2(int idx, double* ptr){
        ptr = &a[idx];
      }
    

    ptr 会是一个 复制 main() ptr 在函数中,您正在更改 属于 ptr 主() .

    ( 下面将向您展示如何完成您正在尝试的任务,但并不建议将其视为正确的方法。请参阅您原始问题下方的@tadman评论)

    你可以通过 地址 主() 并更新该地址的指针,例如。

      void get_ptr2(int idx, double** ptr){
        *ptr = &a[idx];
      }
    

    称为:

      double* ptr;
      data.get_ptr2(10, &ptr);
      std::cout << *ptr << std::endl; 
    

    指针将保存正确的地址,取消对指针的引用将提供所需的值。

    你的选择 value 有点不同。在那里,你可以传递一个指针引用,重载一秒钟 get_ptr2() ,例如。

      void get_ptr2(int idx, double*& ptr){
        ptr = &a[idx];
      }
    

    但是,您不能传递 价值 作为参考。您可以创建第二个指针来保存地址,并更新指针所保存的值,例如。

      double value, *valptr = &value;
      data.get_ptr2(10, valptr);
      std::cout << *valptr << std::endl; 
    

    它还输出所需的值。

    示例代码

    #include<vector>
    #include<iostream>
    using namespace std;
    
    struct Data
    {
      vector<double> a;
      Data() : a(vector<double>(100, 123.0)) {};
      double* get_ptr(int idx){
        return &a[idx];
      }
      void get_ptr2(int idx, double*& ptr){
        ptr = &a[idx];
      }
      void get_ptr2(int idx, double** ptr){
        *ptr = &a[idx];
      }
    };
    
    int main(){
      auto data = Data();
      std::cout << *(data.get_ptr(10)) << std::endl; 
    
      double value, *valptr = &value;
      data.get_ptr2(10, valptr);
      std::cout << *valptr << std::endl; 
    
      double* ptr;
      data.get_ptr2(10, &ptr);
      std::cout << *ptr << std::endl; 
    }
    

    示例使用/输出

    $ ./bin/get_ptr
    123
    123
    123