在C/C++中编写“指向某事物的指针”的好方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在C/C++中编写“指向某事物的指针”的好方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2423字,纯文字阅读大概需要4分钟。
内容图文
在C/C++中编写“指向某事物的指针”有“好”的方法吗?
我用来写void foo(char * str);但有时我发现它非常不合逻辑,因为str的类型是“指向char的指针”,那么将*附加到类型名称应该更合乎逻辑.
写指针有规则吗?
char*str;
char* str;
char *str;
char * str;
解决方法:
常见的C约定是写入T * p,而常见的C约定是写入T * p.两者都解析为T(* p); *是声明符的一部分,而不是类型说明符.这纯粹是指针声明语法的一个意外,你可以用它来编写它.
C(以及扩展,C)声明语法是以表达为中心的; IOW,声明的形式应该与代码中相同类型的表达式的形式相匹配.
例如,假设我们有一个指向int的指针,我们想访问该整数值.为此,我们使用* indirection运算符取消引用指针,如下所示:
x = *p;
表达式* p的类型是int;因此,p的声明应该是
int *p
p的int-ness由类型说明符int提供,但p的指针由声明符* p提供.
作为一个稍微复杂的例子,假设我们有一个指向float数组的指针,并希望通过指针访问数组第i个元素的浮点值.我们取消引用数组指针并下标结果:
f = (*ap)[i];
表达式(* ap)[i]的类型是float,因此它遵循数组指针的声明
float (*ap)[N];
ap的float-ness由类型说明符float提供,但指针-ness和array-ness由声明符(* ap)[N]提供.请注意,在这种情况下,*必须明确地绑定到标识符; []在表达式和声明语法中具有比一元*更高的优先级,因此float * ap [N]将被解析为float *(ap [N])或“指向浮点数的指针”,而不是“指向浮动数组“.我想你可以把它写成
float(* ap)[N];
但我不确定这是什么意思;它不会使ap的类型更清晰.
更好的是,指向函数的指针如何返回指向int的指针数组的指针:
int *(*(*f)())[N];
同样,至少有两个*运算符必须在声明符中明确绑定;将最后一个*绑定到类型说明符,如
int* (*(*f)())[N];
只是表明IMO思维混乱.
即使我在自己的C代码中使用它,即使我理解为什么它变得流行,我对T * p约定背后的推理的问题是它只是在最简单的指针声明之外不适用,它强化了C和C声明语法的简单到错误的观点.是的,p的类型是“指向T的指针”,但这并没有改变语言语法所涉及的事实*绑定到声明符,而不是类型说明符.
对于另一种情况,如果a的类型是“N元素数组T”,我们不写
T[N] a;
显然,语法不允许它.同样,这个论点在这种情况下并不适用.
编辑
正如Steve在评论中指出的那样,你可以使用typedef隐藏一些复杂性.例如,您可以重写
int *(*(*f)())[N];
就像这样
typedef int *iptrarr[N]; // iptrarr is an array of pointer to int
typedef iptrarr *arrptrfunc(); // arrptrfunc is a function returning
// a pointer to iptrarr
arrptrfunc *f; // f is a pointer to arrptrfunc
现在你可以干净地应用T * p约定,将f声明为arrptrfunc * f.我个人并不喜欢用这种方式做事,因为从typedef中不一定清楚如何在表达式中使用f,或者如何使用arrptrfunc类型的对象.非typedef’d版本可能很丑陋且难以阅读,但至少它告诉你需要事先了解的所有内容;你不必去挖掘所有的typedef.
内容总结
以上是互联网集市为您收集整理的在C/C++中编写“指向某事物的指针”的好方法全部内容,希望文章能够帮你解决在C/C++中编写“指向某事物的指针”的好方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。