本文主要记录如下4个要点:
1,union的特性
2,位域
3,指针的++运算
4,后++的优先级
5,查看机器大小端模式
一&二
#define registerAddress (0x77800058)
typedef union {
int whole;
struct {
int ain0sel :2;
int :6;
int ain1sel :3;
} bit;
} switch_select;
switch_select date;
date.whole = *(int*)(registerAddress )
switch (data.bit.ain0sel) {
case 1:
//handle 1
break;
case 2:
//handle 2
break;
default:
return err;
}
int *date1, date2;
int *a, *b, *c;
int i, j, k;
date1 = (int*)(registerAddress )
date2 = (int*)(registerAddress )
a = date1++; //a = 0x77800058
b = date1++ //b = 0x7780005c
c = date1++; //c = 0x77800060
i = *date2++; // i = *a;
j = *date2++;
k = *date2++;
记住非常重要的一点:指针++是按照指针的类型所占的字节byte数相加。
原因:
内存储器编址是按字节来编址的.
即使是32位的计算机,其基本寻址的存储单元也是1个字节,即8位.
一个变量可以有多个字节,那么得到的地址其实是这个变量所占第一个字节的地址,32位的字长共占4个存储单元
后++的意义:
是整个语句结束后再执行+1的动作!!
但是for循环中的i++和++i都是在整个for循环语句结束后再执行+1的动作!(貌似primer c++中有介绍吧,自己验证下)
如下面两个printf的结果是一致的:
#include <stdio.h>
int main(){
int i = 0;
int var = 9;
for (i = 0; i < 3; i++){
var = i;
printf("For body, after i++ is:%d\n", var); //0, 1, 2
}
for (i = 0; i < 3; ++i){
var = i;
printf("For body, after ++i is:%d\n", var); //0, 1, 2
}
return 0;
}
上面的for循环其实等价于:
--------------------------------------------------------------------
for (i = 0; i < 3; ){
var = i;
printf("For body, after ++i is:%d\n", var); //0, 1, 2
i++;
}
--------------------------------------------------------------------
如下例子:
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
int *b;
b = a;
int i = *b++; //i = 1
int j = *++b; //j = 3
int k = (*b++ + 5) + *b++; //k = 7,这里的两个*b++都没有因为其中一个而受到影响,是相同的值
大小端查看:
#include <stdio.h>
int main(){
int x0, x1;
short x = 0x1122;
x0=((char*)&x)[0]; //Lower address;
x1=((char*)&x)[1]; //Hight address;
printf("Lower[%d]\nHighter[%d]\n", x0, x1);
return 0;
}