从结构中访问变量

时间:2009-09-03 06:35:50

标签: c++ pointers indirection

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

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

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

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

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

6 个答案:

答案 0 :(得分:5)

正如泰勒所说,双星号是“指向指针的指针”,你可以根据需要拥有多个指针级别。

我相信你知道,箭头操作符(a->b)是取消引用指针的星号的快捷方式,以及访问字段的点,即

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

括号是必要的,因为点更紧密。双星号没有这样的运算符,在访问字段之前,您必须首先取消引用以达到所需的级别:

Display **dpl = ...;

(*dpl)->a = 42;

(**dpl).a = 42;

答案 1 :(得分:2)

将其视为*(*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 ++中则少用,但它仍然适用于其他指针。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

**表示它是指向指针的指针。基本上它指向另一个指针,然后指向其他东西,在您的情况下为Display结构。

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

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

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

答案 4 :(得分:0)

由于disp是一个指针,你必须使用 - &gt;

如果你只有一个“正常”变量(即在堆栈上) 显示d;

你可以写d.a

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

答案 5 :(得分:0)

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

它被称为解除引用