数据结构

本文主要记录如下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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值