结构和链表访问。

时间:2016-04-20 02:07:30

标签: c

#include <stdio.h>

int main(void)
{
typedef struct{ 
    int a;
} cool;

cool x;

(&x)->a = 3;
x.a = 4;
}

我想知道(&amp; x) - &gt; a和x.a做同样的事情。我把它们都编码了,似乎它们都改变了x.a的值。我知道它必须是 - &gt;左侧的指针,但是(&amp; x)似乎没有问题。打印出x.a适用于他们两个,并给我正确的答案。我查了很多关于指针,链表和结构的内容,但我仍然无法找到答案。有可能得到解释吗?谢谢!

2 个答案:

答案 0 :(得分:2)

->运算符需要左侧的指针。 &x返回x的地址,以便满足该要求(即使它完全是多余的)。以另一种方式思考......

cool *y = x;
y->a = 3;

.运算符需要左侧的stack allocated结构。 x就是这样,所以x.a工作正常。

你也可以采用另一种方式,如果你有一个指针y,你可以用*y取消引用它并在其上使用.(*y).a。这也是完全多余的。

答案 1 :(得分:1)

&前缀运算符返回您放在前面的任何对象的内存地址

这意味着您必须将它放在实际具有内存地址的对象之前。例如,文字和临时表达结果不一定有地址。使用register存储类声明的变量也没有地址。

因此:

int i = 5;
&i;  // works

&5;  // Nope!

&(i + 1); // Nope!

&i + 1;  // Works, because &i has higher precedence than +1.

那么对象的地址给你的是什么?它是对象的指针。这是使用进行动态内存分配的方法。这就是malloc()等函数的用武之地。这就是构建任意大型数据结构的方法。

在C中,数组表示为指针。因此,数组和指针通常可以互换使用。例如:

char buffer[100];  // array
strcpy(buffer, "hello"); // strcpy is declared to take (char *, const char *)

address_of 运算符相反的是* 取消引用运算符。如果我声明指向某个东西的指针,我可以使用以下语法得到“它指向的内容”:

int i = 5;
int *pi = &i;  // pointer to int. Note the * in the declaration?

i + i; // 10
i + *pi;  // Also 10, because pi "points to" i

如果您的汇总类型类似于structunion,则必须执行以下操作:

struct {
    int a;
} s;

s.a = 5;

/* ??? */ ps = &s;  // pointer to s

s.a;  // 5

(*ps).a; // Also 5, because ps points to s.

ps->a;  // 5, because a->b is shorthand for (*a).b

当然,这只适用于指向可以使用.member并且具有适当命名的成员的对象的指针。例如,您不能这样做这样:

i = 5;
pi = &i;

pi->a;  // WTF? There is no i.a so this cannot work.

如果你有一个指针,你可以获取它的地址。然后你有一个指针指针。有时候这是一个指针数组,就像传递给argv的{​​{1}}数组一样:

main

你可以通过指针指针做奇怪的事情:

int main(int argc, const char *argv[]);
int main(int argc, const char **argv); // Effectively the same.

注意:我不知道该代码的作用。但是,如果你正在使用指针,那么你最终可以做的事情。