我是靠谱客的博主 高大刺猬,最近开发中收集的这篇文章主要介绍指针的浅理解指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

指针

什么是指针?

对内存中每一个字节分配一个32或64位得编号(由32/64处理器决定),这个编号,就叫指针,也叫地址。

有专门用于存放地址得变量,叫做指针变量。

对内存的了解

一个字节(Byte)有8个位(bit),一个位(bit)放一个二进制数字。

一个十六进制数字有四位,所以一个字节只能放两个十六进制得数字。比如一个字节只能放0x01(0x表示十六进制,0算一个数字,1也是一个数字)

WindowsLinux系统下存储是小端模式,即倒着存储从后往前一个字节一个字节的拿出来,而不是完全倒过来)。

比如: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

最后

以上就是高大刺猬为你收集整理的指针的浅理解指针的全部内容,希望文章能够帮你解决指针的浅理解指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部