关于指针(对于这种情况的结构),我理解如果'a'是结构并且在结构中声明'b',那么我们可以通过以下方式访问数据:
a->b
现在,我最近发现C有很多关于指针的快捷方式,其中一个是上面的箭头操作符。
我看到'a-> b'被写成'[a] + b',这样:
a->b <=> [a] + b //meaning that they are interchangeable
然而,我无法理解这个'[a] + b'实际意味着什么,并且真的很感谢有人为我详细说明(或者我误读了,而且上面的内容是无意义的!)。非常感谢提前!
答案 0 :(得分:3)
在C语言中,[a] + b
没有任何意义。这是一个语法错误。你的书可能用这种符号来解释某些东西,但脱离上下文它没有任何意义。但是,它看起来与其他几个指针快捷键相似,导致混淆。因此,为了消除这种困惑,以下是我能想到的所有指针快捷键:
a->b
是(*a).b
的同义词,即访问指向struct
类型的指针的成员。a[b]
是*(a + b)
的同义词,即通过对指定偏移量执行指针算法来访问数组元素。
a[b]
与b[a]
同义,因为a[b]
&lt; =&gt; *(a + b)
&lt; =&gt; *(b + a)
&lt; =&gt; b[a]
。邪恶的骗子会做0[x]
或5["string"]
这样的事情来迷惑你。不要害怕,现在你知道答案。*&a
是a
的同义词,即解除引用地址。它创建一个指针,然后立即取消引用它,产生原始对象。
&a[b]
会转换为&*(a + b)
,转换为a + b
。 &a[b]
和a + b
都以相同的方式创建指向数组元素的指针。 “最佳”方式的方式取决于个人偏好,就业地点和月相。&*a
与*&a
不同。后者创建一个指针,然后取消引用它,产生原始对象。前者假设a
是一个指针,取消引用它,然后获取结果的地址,产生原始指针。标准规定&*a
不要取消引用指针,并且可以安全地用在NULL
指针上。*(type *)&a
是一个邪恶的黑客,你可能会不时看到。它采用a
的地址,将指针强制转换为指向type
的指针,然后取消引用它。这通常是未指定的行为*,但实际上会导致对象a
的位被重新解释为type
对象。这可以让你获得例如float
s或其他对象的按位表示。也许有更好的方法可以实现这个目标,但如果你偶然发现这一行代码,你至少会知道作者的意图。如果我想到它们,我会添加更多。
*我说没有说明,因为如果你做int i = -1; printf("%u\n", *(unsigned int)&i);
,C标准不会强制要求打印值UINT_MAX
(对于二进制补码),UINT_MAX - 1
(对于一个人来说)补充)或(unsigned int)INT_MAX + 2
(用于符号和大小)。
答案 1 :(得分:0)
正如已经指出的那样,[a]+b
无效C.也许他的意思是
a->b <=> a[0].b