概述
指针
什么是指针?
对内存中每一个字节分配一个32或64位得编号(由32/64处理器决定),这个编号,就叫指针,也叫地址。
有专门用于存放地址得变量,叫做指针变量。
对内存的了解
一个字节(Byte)有8个位(bit),一个位(bit)放一个二进制数字。
一个十六进制数字有四位,所以一个字节只能放两个十六进制得数字。比如一个字节只能放0x01(0x表示十六进制,0算一个数字,1也是一个数字)
在Windows和Linux系统下存储是小端模式,即倒着存储(从后往前一个字节一个字节的拿出来,而不是完全倒过来)。
比如:0x01020304在一个字节中的存储格式是
++0x04++ ++0x03++ | ++0x02++ ++0x01++
虽然是反着存储,但提取的时候一定会给你返回来的
一个int指针得跨度是四个字节。所以当int的指针指向首地址时,他的提取会以四个字节来倒着提取(提取结果:0x01020304),同理,当short类型(两个字节)的指针指向收地址时,他的提取会从前两个字节倒着提取(提取结果:0x0304),一个char类型(一个字节)的指针指向它时,只能得到一个字节(提取结果:0x04)
下面是一个例子
int num = 0x01020304;
int *p1 = #
short *p2;
char *p3;
printf("p1 = %#xn",*p1);//p1 = 0x1020304(第一位的0省略了)
p2 = (short *)p1;
printf("p2 = %#xn",*p2);//p2 = 0x304
p3 = (char *)p1;
printf("p3 = %#xn",*p3);//p3 = 0x4
return 0;
我们可以再看用二进制表示的例子,上面的例子只写到了16进制数,实际上存储的是二进制
二进制一个字节就是8个位(只用0和1表示)
十进制数:200
二进制数:1100 1000
那么在一个字节中它的存储情况就是这样的
++1100++ ++1000++ |++0000++ ++0000++|++0000++ ++0000++| ++0000++ ++0000++
int num = 200;
int *p1 = #
short *p2;
char *p3;
printf("p1 = %dn",*p1);//p1 = 200
p2 = (short *)p1;
printf("p2 = %dn",*p2);//p2 = 200
p3 = (char *)p1;
printf("p3 = %dn",*p3);//p3 = -56
return 0;
这里所有指针都指向开头
int指针是四个字节,所以是全部提取,提取结果着这样的:
++0000++ ++0000++|++0000++ ++0000++| ++0000++ ++0000++|++1100++ ++1000++
第一位符号位(0是正,1是负),那么他的计算是:
2^7 + 2^6 +2^3 = 200;
得到了200
short指针两个字节,所以提取了前两个字节
++1100++ ++1000++ |++0000++ ++0000++ ,提取出来就是
++0000++ ++0000++| ++1100++ ++1000++
第一位符号位(0是正,1是负),那么他的计算是:
2^7 + 2^6 +2^3 = 200;
得到了200
char类型指针只有一个字节,所以只能得到一个字节
++1100++ ++1000++
第一位符号位(0是正,1是负),那么他的计算是: -2^7 + 2^6 + 2^3 = -56
最后
以上就是高大刺猬为你收集整理的指针的浅理解指针的全部内容,希望文章能够帮你解决指针的浅理解指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复