首先说一下
一级指针
int a = 0x1234;
char *p = (char *)&a;//这是一个一级指针
这个以32位系统为例,以下所有结果也是基于32bit操作系统的情况下
其中 p是指针变量 char *是指针类型
因为系统是32位的 ,32bit = 4bytes
指针变量存的是地址 系统是32位的 所以所有类型的指针变量都是4bytes,这是第一个概念
上面代码案例输出结果为0x34
#include <stdio.h>
int main()
{
int a = 0x1234;
char *p =(char *)&a;
printf("%#x\n",*p);
return 0;
}
//结果为0x34
为什么是0x34?不该是0x12么?
因为这里涉及到一个大小端的概念,不同的cpu大小端不同
大端,低地址存高位
小端,低地址存低位
低地址是什么?高低位是什么?
指针变量p它创建出来了,是不是也在内存中占了一个地址
既然是地址就是顺序排列的,可以想象一下家里的门牌号
地址从低到高排列 所以低地址从低到查,地址顺序比较小的
&a看见了p的地址就住进来了
你想看看住进来的&a长什么样子,于是你想把它读出来
因为&a太胖了是int类型的 *p是char类型的(读指针变量p里面的数据加个符号*,用*p可以读)
所以你只能看到他一部分 你只能读出来一部分
0x1234你可以理解为从低到高
1脚2腿3身4头
你是大端,你会读到它的高位也就是身子和头
0x34
你是小端,你会读到它的高位也就是脚和腿
0x12
这个是高低位,它是针对存到指针变量里面的地址的
假如*p是short类型就厉害了
可以读到0x1234 可是*p它不是short类型
指针变量p无论是什么类型大小都是4bytes,但是你要读出来数据就要用*p
*p的类型是char,p的类型是char*如果分不清可以在论坛搜搜加深了解
不同类型的指针变量,对C语言中的同一块内存进行读取的时候,读取的字节数也不同。
指针变量是p,读取时候用的*p,不要迷糊哈
同理,不同类型变量每次移动大小也不一样。
p++;
这个就是移动的意思
所以指针变量就存个地址,指针变量也就是存地址的,所以才固定大小4bytes,要想把指针存的地址全部读出来或者移动还得看指针类型
如果是二级指针呢
一级指针
char *p;
*p类型是char;
char是普通类型
二级指针
char **p;
那么*p的类型就是char *了
char *是指针类型
char *就不是普通类型了,它是指针类型
指针大小就是4bytes
所以,二级指针或者多级指针移动都是4bytes
GAME OVER
大家好 我是如梦兽 碎片时间随笔小作写的不好莫怪莫怪