- 课程名称:嵌入式工程师
- 学习章节:一级指针的简介
- 学习链接:https://class.imooc.com/sc/148/learn
- 讲师姓名:大白老师
课程内容:
一级指针简介
数据类型
nt m = 20;
int *p = &m;
指针变量p本身的数据类型:int *
指针变量保存的对象的数据类型: int
大小端模式
大端模式: ARM, 摩托罗拉
内存的高地址存储数据的低位,内存的低地址存储数据的高位。
(低地址存高位—低对高)
小端模式: intel,MIPS
内存的低地址存储数据的低位,内存的高地址存储数据的高位。
(低地址存低位—低对低)
代码示例
int x = 0x12345678; //1个十六进制数 = 4个二进制数
为什么一个十六进制=4个二进制
十六进制的进位是16
二进制的进位是2
2连续进位4次才是十六进制
2_2_2*2
// 123 左边为高位,右边为低位。
//1bytes = 8个二进制数
// 1bytes = 2个十六进制数
低地址
小端模式 大端模式
0xdff30 0x78 0x12 <------
0xdff31 0x56 0x34
0xdff32 0x34 0x56
0xdff33 0x12 0x78
高地址
指针的结论
结论一
在32bit的操作系统中,所有类型的指针变量都是4bytes. [因为地址为4bytes]
1bytes=8bit
4个字节是32bit
所有类型的指针变量包括:
char *x;
short *y;
int *z;
用32bit编译器编译方法
gcc -m32 03-pointer.c //-m32以32bit编译器来编译,方便讲解
结论二
不同类型的指针变量,对C语言中的同一块内存进行读取的时候,每次读取的字节数不同。(读取为指针变量 + *,剩下数据类型的大小)
int a = 0x12345678; (ubuntu默认小端模式)
char *p = (char *)&a;
short *q = (short *)&a;
int *m = &a;
*p; //读取变量a的1bytes数据
*q; //读取变量a的2bytes数据
*m; //读取变量a的4bytes数据
结论三
在32bit的操作系统中,不同类型的指针变量每次的移动大小不一样。(每次移动的大小为指针变量 + *,剩下数据类型的大小)
int a = 0x12345678;
char *p = (char *)a;
short *q = (short *)a;
int *m = a;
p++; //每次移动1bytes的大小
q++; //每次移动2bytes的大小
m++; //每次移动4bytes的大小
总结
示例
char *p
指针类型
char *
指针变量
p
解析
根据指针的类型读写字节
由于地址大小是固定的,所以指针变量大小固定,因为指针变量用来存放地址
但是通过指针来访问内存的时候,根据指针的类型大小来访问
这也是为什么要定义不同类型指针的原因
你想通过指针来访问内存,你就需要先确定你想访问的大小
根据访问的大小来定义你的指针类型
学习收获:
通过本章学习知道了指针变量就存个地址,指针变量也就是存地址的,所以才固定大小,要想把指针存的地址全部读出来还得看指针类型
之前还没两个结论搞混了 问了一下老师清楚了
截图打卡:
共同学习,写下你的评论
评论加载中...
作者其他优质文章