关于C语言中的指针基础知识
关于指针(在本例的结构中),我理解如果“a”是一个结构,并且“b”在结构中声明,那么我们可以通过以下方式访问数据:关于C语言中的指针基础知识,c,pointers,struct,C,Pointers,Struct,关于指针(在本例的结构中),我理解如果“a”是一个结构,并且“b”在结构中声明,那么我们可以通过以下方式访问数据: a->b 现在,我最近发现C有很多关于指针的快捷方式,其中之一就是上面提到的箭头操作符 我看到“a->b”被写成“[a]+b”,这样: a->b <=> [a] + b //meaning that they are interchangeable a->b[a]+b//意味着它们可以互换 然而,我很难理解“[a]+b”的实际含义,我非常希望有人能为我
a->b
现在,我最近发现C有很多关于指针的快捷方式,其中之一就是上面提到的箭头操作符
我看到“a->b”被写成“[a]+b”,这样:
a->b <=> [a] + b //meaning that they are interchangeable
a->b[a]+b//意味着它们可以互换
然而,我很难理解“[a]+b”的实际含义,我非常希望有人能为我详细说明(或者我可能误读了,上面的内容是胡说八道!)。非常感谢 在C语言中,
[a]+b
没有任何意义。这是一个语法错误。你的书可能用这种符号来解释一些事情,但断章取义,它毫无意义。但是,它与其他几个指针快捷方式非常相似,可能会引起混淆。为了消除这种困惑,以下是我能想到的所有指针快捷方式:
是a->b
的同义词,即访问指向(*a).b
结构类型的指针的成员
是a[b]
的同义词,即通过执行指向指定偏移量的指针算术来访问数组元素。*(a+b)
- 注意,由于上述原因,
与a[b]
同义,因为b[a]
a[b]
*(a+b)
*(b+a)
。邪恶的骗子会做类似于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
的指针,并取消对该类型的引用。这通常是未指定的行为*,但实际上会导致对象类型
的位被重新解释为a
对象。这使您可以获取类型
s或其他对象的位表示。也许有更好的方法来实现这一目标,但如果您偶然发现这一行代码,您至少会知道作者的意图float
*我说未指定是因为,如果你做了
inti=-1;printf(“%u\n”、*(无符号整数)和i)代码>,C标准没有规定是否打印值UINT\u MAX
(对于两个补码),UINT\u MAX-1
(对于一个补码)或(无符号int)int\u MAX+2
(对于符号和幅度)。在C语言中,[a]+b
没有任何意义。这是一个语法错误。你的书可能用这种符号来解释一些事情,但断章取义,它毫无意义。但是,它与其他几个指针快捷方式非常相似,可能会引起混淆。为了消除这种困惑,以下是我能想到的所有指针快捷方式:
a->b
是(*a).b
的同义词,即访问指向结构类型的指针的成员
a[b]
是*(a+b)
的同义词,即通过执行指向指定偏移量的指针算术来访问数组元素。
- 注意,由于上述原因,
a[b]
与b[a]
同义,因为a[b]
*(a+b)
*(b+a)
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
的地址,将指针强制转换为指向类型
的指针,并取消对该类型的引用。这通常是未指定的行为*,但实际上会导致对象a
的位被重新解释为类型
对象。这使您可以获取float
s或其他对象的位表示。也许有更好的方法来解决这个问题
a->b <=> a[0].b