(2)typeof关键字的作用是:typepef(a)时由变量a得到a的类型,typeof就是由变量名得到变量数据类型的。
(3)这个宏的工作原理:先用typeof得到member元素的类型定义成一个指针,然后用这个指针减去该元素相对于整个结构体变量的偏移量(偏移量用offsetof宏得到的),减去之后得到的就是整个结构体变量的首地址了,
再把这个地址强制类型转换为type *即可。
5.7 p是一个地址,(int)p+6 和(char *)+6;效果是一样的,第一种是将地址p当作int型加减,第二种是将地址p做为char *指针,他每次加减都是一字节一字节相加减的,如果是 (int *)P+6,那么他每次加减都是按照4字节一跳。就相当于加了+4*6;
5.8 小端模式:变量的高地址存放在高地址,低地址存放在低地址; 通信模式也要分大小端,先发送/接受的是高地址还是低地址,
大端模式:变量的高地址存放在低地址,低地址存放在高地址;
测试:有用共用体 union 和指针方式来测试,基本思路是让 int a=1; 看低地址 char 是0还是1 ;变量都是从地址开始存放,只是变量的高地址和低地址先存放谁不确定。
不能用位与来测,因为存放和读取都是按照某一个方式来的,结果永远都是一样的。int a=1; char b=(char)a;这种方式不可以测试,因为不管大小端,它都以变量a的低地址部分赋给b;
union stu{
int a; int ce( )
{
int a=1;
int b=*((char *)&a);
return b;
}
char b;
}
int ce( )
{
union stu s;
s.a=1;
return s.b;
}
5.9、枚举类型(int型): 这样写默认从第一个常量开始是0,1,2,3,4.........
也可以自己赋值,但是每一个值是不一样的,否则逻辑上出错。
enum week{
sunday, sunday=1,
moday, moday=5,
tuseday, 然后其他常量以此递增。
wenzeday,
friday,
saterday,
}today; today=sunday;
* // 错误1,枚举类型重名,编译时报错:error: conflicting types for ‘DAY’
typedef enum workday
{
MON, // MON = 1;
TUE,
WEN,
THU,
FRI,
}DAY;
typedef enum weekend
{
SAT,
SUN,
}DAY;
*/
/ /错误2,枚举成员重名,编译时报错:redeclaration of enumerator ‘MON’
typedef enum workday
{
MON, // MON = 1;
TUE,
WEN,
THU,
FRI,
}workday;
typedef enum weekend
{
MON,
SAT,
SUN,
}weekend;
}
六、C语言宏定义与预处理、函数和函数库(看博客strcyp原函数)
{
6.1、源码.c->(预处理)->预处理过的 .i 文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序
预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链。gcc就是一个编译工具链。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-8.html
质检总局
集体向520万刷起来集体心意送给烊烊生日礼物#易烊千玺##易烊千玺真的很不错##全员即刻加速1128迈#
双方数量相等