一.指针的本质
指针的本质就是有类型的地址。地址指的是地址总线上的地址码表,而类型决定了我们操作这个指针时,要从这个地址码上读写的长度。即指针的类型决定读写一个地址块的数据长度(1字节、2字节、4字节还是结构体定义的长度)。
比如(uint8_t *)(0x12345678):C语言中*可以把他后面的内容变成地址码,所以(*)0x12345678)就是把这个常数转化为一个地址码(即指针),那这个指针的类型是什么呢?是uint8_t类型的。那么我们去操作这个指针的时候,就是读写0x12345678这个地址上一字节的内容。
写示例:*((uint8_t *)(0x12345678))= 0x55;
二.指针的大小、指针变量的值、指向指针的指针以及指针的自增
1.指针的占用的字节数就是单片机地址总线的字节数(位数/8);
2.指针p本身是个变量,只不过这个变量的值是他所指向的内存的地址,通过*p就可以读写那块内 存,读写的数据长度就是指针类型的大小
3.
如上图所示,q就是个指向指针的指针,q的值就是指针p的地址。通过*q就可以直接读写p的值,其实此时*q就是p。而相对的,p是一个指针,他的值就是buf[8]这个数组第一个元素的地址,通过*p就可以读写buf[0]。我们前面说过,指针是有类型的地址,而当前类型是int8_t,那么让p+1,地址就只会往后走一个int8_t的长度,那么p+1的数值就是buf[1]的地址,*(p+1)就是操作buf[1]了。
再如果指针p的类型是int,即int *p,如果p等于buf[0]的地址,那p+1以后的值就是往后int长度(4个),p+1的值就是&buf[4],*(p+1)访问的就是buf[4]。
总结
三.数组和指针
1.不要把数组a[n]后面的方括号当成是数组的专利
[n]的真正含义是以前面的指针(有类型的地址)为基准,向后移动长度(n*类型大小)个字节后的地址位置,取出这个位置上的值。
比如:
int a[10];
int *p;
p = a;
此时就可以直接操作p[5],p[5]就是a[5]。
标签:int,读写,C语言,地址,类型,buf,指针 From: https://blog.csdn.net/sycc512/article/details/142040351