C语言的“感觉奇葩”的使用、冷门知识


冷知识(详细的原因都在《基础_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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超自然祈祷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值