#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适用于他们两个,并给我正确的答案。我查了很多关于指针,链表和结构的内容,但我仍然无法找到答案。有可能得到解释吗?谢谢!
答案 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
如果您的汇总类型类似于struct
或union
,则必须执行以下操作:
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.
注意:我不知道该代码的作用。但是,如果你正在使用指针,那么你最终可以做的事情。