关于C中的指针基础知识

时间:2011-03-16 07:00:22

标签: c pointers struct

关于指针(对于这种情况的结构),我理解如果'a'是结构并且在结构中声明'b',那么我们可以通过以下方式访问数据:

a->b

现在,我最近发现C有很多关于指针的快捷方式,其中一个是上面的箭头操作符。

我看到'a-> b'被写成'[a] + b',这样:

a->b <=> [a] + b //meaning that they are interchangeable

然而,我无法理解这个'[a] + b'实际意味着什么,并且真的很感谢有人为我详细说明(或者我误读了,而且上面的内容是无意义的!)。非常感谢提前!

2 个答案:

答案 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"]这样的事情来迷惑你。不要害怕,现在你知道答案。
  • *&aa的同义词,即解除引用地址。它创建一个指针,然后立即取消引用它,产生原始对象。
    • 请注意,&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