我们如何访问结构的变量?我有一个结构:
typedef struct {
unsigned short a;
unsigned shout b;
} Display;
在我的其他课程中我有一个方法:
int NewMethod(Display **display)
{
Display *disp=new Display();
*display = disp;
disp->a=11;
}
**显示是什么意思?要访问结构的变量,我使用了->
,还有其他方法吗?
答案 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;
它被称为解除引用