整数在内存中的存储
借助调试器,我们可以看到内存中的情况,下面举一个简单的例子来说明:
int main(){
int a = 10;
system("pause");
return 0;
}
我们首先写了一个int a ,然后我们可以打开我们的调试器(调试—窗口—内存)就可以看到下面这个图,在这个图的最上边是地址。
地址:想看哪个内存空间,就在这里输入地址就行了,可以直接输入取地址的表达式,让VS自动计算;
绿色框:当前的地址;
蓝色框:内存中的实际内容,按照十六进制表示的;
紫色框:表示一个字节,而此时的0a的地址就是0x003DFDD0,00的地址就是0x003DFDD1;
红色框:也就是每行的第一个,他们对应的地址就是左边的当前地址;
黄色框:把内存中的内容当成字符来理解;
char name[] = "hello";
同时我们可以看看字符的内存情况:
我们可以看到右边字符框中有hello,他对应的内存中的情况为:68,65,6c,6c,6f,这就是hello这几个字符所对应的ASCII值。
字节序
字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。(左高右低)
小端字节序
所谓的小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
大端字节序
所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
原码
原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值,CSDN符号位位“0”时表示正数,符号位为“1”时表示负数,原码又称带符号的绝对值。
反码
反码通常是用来由原码求补码或者由补码求原码的过渡码。
补码
补码是计算机把减法运算转化为加法运算的关键编码。补码存在的意义就是就是为了让硬件实现更简单。
三者之间的转换和简单运算
1.正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同。
2.负整数的符号位固定为1,由原码变为补码时,规则如下:
(1)原码符号位1不变,整数的每一位二进制数位求反,得到反码;
(2)反码符号位1不变,反码数值位最低位加1,得到补码。
大部分计算机都是小端字节序,这里我们int a=-10,-10的原码就是上图的第一行,因为我们是小端字节序,所以把字节序颠倒过来就是-10的存储方式,它是按补码的方式存储的。而原码到补码就是原码取反+1就可以得到补码。
字符指针
含义
C语言中的字符指针,有两种含义:
1.指向一个字符;
2.指向一个字符串。
在上图中,p指向的是一个字符;而p2指向的是一个字符串(字符串是一个特殊的字符数组,以\0结尾),数组名可以转成首元素地址,则此时p2中保存的就是‘liujian’中的首元素‘l’的地址。
知道了p2,就可以通过解引用和指针+1的运算,把字符串的每个内容都获取到,此时就当于使用p2来表示一个字符串了。
指针数组
是数组,每个元素是个指针。
* arr[4] =int { 0 };
数组指针
是指针,指向了一个数组。
int arr2[4] = { 0 };
int(*p)[4] = &arr2;
数组名取地址,得到的是指向该数组的指针;直接使用数组名得到的是指向首元素的指针。
ok ,文章就先到这里了,希望这篇文章能够帮助到你对指针的认识,若有不足或者不正之处,希望谅解并欢迎批评指正!
如果本文章对你有帮助,哪怕一点点,那就请点一个赞呗,谢谢~~