C语言的“感觉奇葩”的使用、冷门知识
【int max()】括号【()】在这里叫做“函数调用运算符”见谭浩强 C 第四版 P57。
【(int *)a】将变量a转换成int*型,(类型)是强制类型转换运算符(https://zhidao.baidu.com/question/124605416.html)
不同类型变量间运算 :精度较低的会自动转换为精度较高的
小写a(97)与大写A(65)为什么差32而不是24?就差从左数第3位的1:
a(97)的二进制:0110 0001;A(65)的二进制:0100 0001;(硬件上好改)
int*&a
意思是:整形指针a的引用
*指针
结合性:右到左
优先级:低于【.】 r->和(*r).
r->这种写法和(*r).是完全等效的,但是省去了两个字符。
strcpy((*r).name,"Leigh");
您可以像对待一个普通结构体变量那样对待*r,但在遇到C的操作符优先级问题时要小心。如果去掉*r两边的括号则代码将无法编译,因为“.”操作符的优先级高于“*”操作符。使用结构体指针时不断地输入括号是令人厌烦的,为此C语言引入了一种简记法达到相同的目的:
strcpy(r->name,"Leigh")
工程中的指针
static
void*(摘自http://zhengdl126.iteye.com/blog/1739165)
void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型
转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“"=" : cannot convert from "int *" to "float *"”,必须改为:
p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包
容“无类型”。道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面的语句编译出错:
void *p1;
int *p2;
p2 = p1;
提示“"=" : cannot convert from "void *" to "int *"”。
static void
* a = &a; //以上两种的组合(以下摘自https://zhidao.baidu.com/question/422255015.html)
void*()()//void型函数指针
void * fun( ) ; //声明一个返回值是任意类型的指针 的函数fun()void vfun( ) ; //声明一个没有返回值 的函数vfun()
void (*)( ) 这是一种变量类型,可用来定义函数指针变量,如:
void (*pfun)( ) ; //声明一个函数指针变量pfun,该类型函数就是void vfun( ) 这种类型,pfun可以指向这类函数,如:pfun=vfun ;
结构体的指针*L 阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了