【问题标题】:Accessing variables from a struct从结构访问变量
【发布时间】:2010-11-25 04:42:09
【问题描述】:

我们如何访问结构的变量?我有一个结构:

typedef struct {
   unsigned short a;
   unsigned shout b;
} Display;

在我的其他课程中,我有一个方法:

int NewMethod(Display **display)
{
   Display *disp=new Display();
   *display = disp;
   disp->a=11;
}

**显示是什么意思?要访问我使用-> 的struct 变量,还有其他方法吗?

【问题讨论】:

  • 如果您使用 C++,为什么要使用古老的 typedef struct {/*...*/} Display?为什么要传递指针而不是引用?如果你正在分配,为什么要使用裸指针? (哦,那个函数没有返回它承诺的int。)

标签: c++ pointers indirection


【解决方案1】:

**display 只是一个双指针(指向 Display 类型指针的指针)。

【讨论】:

    【解决方案2】:

    ** 表示它是一个指向指针的指针。基本上它指向另一个指针,然后指向其他东西,在你的例子中是 Display 结构。

    如果您仅使用对象调用函数,则可以使用 . 运算符访问成员。

    int NewMethod(Display display)
    {
    Display disp = display;
    disp.a=11;
    }
    

    但是这样你不是直接修改Display display对象而是一个本地副本。您的代码表明需要在函数之外对对象进行更改,因此您唯一的选择是您描述的那个(好吧,也许通过引用传递参数,但语法或多或少相同(->))。

    【讨论】:

      【解决方案3】:

      正如泰勒所说,双星号是“指针的指针”,您可以根据需要拥有任意多级的指针。

      我相信您知道,箭头运算符 (a->b) 是取消引用指针的星号和访问字段的点的快捷方式,即

      a->b = (*a).b;
      

      括号是必要的,因为点绑定得更紧密。双星号没有这样的运算符,您必须先取消引用才能达到所需的级别,然后才能访问字段:

      Display **dpl = ...;
      
      (*dpl)->a = 42;
      

      (**dpl).a = 42;
      

      【讨论】:

      • 该死!我没想到。很好的答案。
      【解决方案4】:

      因为 disp 是你必须使用的指针 ->

      如果您只有一个“普通”变量(即在堆栈上) 显示d;

      你可以写d.a

      结构与类相同。唯一的区别(我知道)是默认情况下所有成员都是公开的。

      【讨论】:

        【解决方案5】:

        你可以做 (*disp).a=11;

        这叫解引用

        【讨论】:

          【解决方案6】:

          把它想象成*(*display)。当您想将整数的地址传递给函数以便设置整数时,您可以使用:

          void setTo7 (int *x) {
              *x = 7;
          }
          : : :
          int a = 4;
          setTo7 (&a);
          // a is now 7.
          

          它与你所拥有的没有什么不同,只是你想设置一个指针的值,所以你需要将指针传递给那个指针。很简单,不是吗?

          试试这个:

          #include <stdio.h>
          #include <string.h>
          
          static void setTo7 (int *x) { *x = 7; }
          
          void appendToStr (char **str, char *app) {
              // Allocate enough space for bigger string and NUL.
          
              char *newstr = malloc (strlen(*str) + strlen (app) + 1);
          
              // Only copy/append if malloc worked.
          
              if (newstr != 0) {
                  strcpy (newstr, *str);
                  strcat (newstr, app);
              }
          
              // Free old string.
          
              free (*str);
          
              // Set string to new string with the magic of double pointers.
          
              *str = newstr;
          }
          
          int main (void) {
              int i = 2;
              char *s = malloc(6); strcpy (s, "Hello");
              setTo7 (&i); appendToStr (&s, ", world");
              printf ("%d [%s]\n",i,s);
              return 0;
          }
          

          输出是:

          7 [Hello, world]
          

          这将安全地将一个字符串值附加到另一个,分配足够的空间。双指针经常用在智能内存分配函数中,在 C++ 中使用较少,因为你有一个原生字符串类型,但它对其他指针仍然有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-01
            • 2019-06-24
            • 1970-01-01
            • 2018-12-05
            • 2021-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多