C语⾔如何操作内存
1、⽤变量名来访问内存(c语⾔对内存地址的封装、数据类型、函数名)--直接访问内存(使⽤地址)
  如 int a; 编译器将申请32bit的内存(4个内存单元),同时将内存地址和变量名a绑定,操作a时,编译器根据a绑定的地址去寻对应的内存单元,我们则⽆需再关注具体的内存地址了。所以变量名被编译器绑定上了地址。
  数据类型:表⽰⼀个内存格⼦的长度和解析⽅法。(内存编址的单位是⼀个字节)
  (int *) 0;  //0的地址存的是指针,指针指向⼀个int类型的数,数据类型int规定了内存格⼦长度:4字节
  (float *) 0;  //0的地址存的是指针,指针指向⼀个float类型的数
  (short ) 0;  //0地址是short类型的变量,存的是short类型的数
  (char ) 0;  //0地址是char类型变量,存的是char类型的数
  这四个只是类型不同,但都是0,0代表内存地址(⼈为指定的)。数据类型只是决定了长度,存的内容(解析⽅法)。
  数据类型决定长度的含义:我们⼀个内存地址(0x30000000),本来这个地址只代表1个字节的长度,但是实际上我们可以通过给他⼀个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x30000000)就能表⽰从这个数字(0x30000000)开头的连续的n(4)个字节的内存格⼦了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)。
数据类型决定解析⽅法的含义:譬如我有⼀个内存地址(0x30000000),我们可以通过给这个内存地址不同的类型来指定这个内存单元格⼦中⼆进制数的解析⽅法。譬如我 (int)0x30000000,含义就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)这4个字节连起来共同存储的是⼀个int型数据;那么我(float)0x30000000,含义就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)这4个字节连起来共同存储的是⼀个float型数据;
  解析⽅法举例:假设内存⾥存着 int a;float a;都存着 0x1111 0101 1101 1011,解析的时候int可能从第⼀位就开始判断符号位,之后的位数都代表数值,⽽float可能从第⼀位后⾯断开,前⾯当做符号位,后⾯作⼩数位,具体的解析⽅法忘记了,⼤概理就是这样,具体的解析⽅法可以看计算机组成原理。内容相同,解析⽅法不同⽽已。
  对数据类型强制转换的理解:
    int a = 1;
    (float)a;
    其实地址a开头的连续4个内存单元格中,其存储的内容没变,还是1对应的2进制,但是本来是以int⽅式解析的,现在被强制转换成以float⽅式解析,如果是(short)a;就是short类型解析以a开头的连续2个内存单元,对另外两个内存单元不作解析
  函数名含义:函数本⾝就是⼀段代码的封装,函数名的含义是⼀段代码的⾸地址,本质就是内存地址。
2、⽤指针间接访问内存
  关于类型(不管是普通变量类型int float等,还是指针类型int * float *等),只要记住:
  类型只是对后⾯数字或者符号(代表的是内存地址)所表征的内存的⼀种长度规定和解析⽅法规定⽽已。
  int a;        // int a;时编译器会⾃动给a分配⼀个内存地址,譬如说是0x12345678
  (int *)a;    // 等价于(int *)0x12345678 对其中内容
float型
  (float *)a; //解析⽅法是以指针来解析的
  C语⾔中的指针,全名叫指针变量,指针变量其实很普通变量没有任何区别。譬如int a和int *p其实没有任何区别,a和p都代表⼀个内存地址(譬如是0x20000000),但是这个内存地址(0x20000000)的长度和解析⽅法不同。a是int型所以a的长度是4字节,解析⽅法是按照int的规定来的;p是int *类型,所以长度是4字节,解析⽅法是int *的规定来的(0x20000000开头的连续4字节中存储了1个地址,这个地址所代表的内存单元中存放的是⼀个int类型的数)。
3、数组管理内存:
   数组管理内存和变量其实没有本质区别,只是符号的解析⽅法不同。(普通变量、数组、指针变量其实都没有本质差别,都是对内存地址的解析,只是解析⽅法不⼀样)。
  int a; // 编译器分配4字节长度给a,并且把⾸地址和符号a绑定起来。
  int b[10]; // 编译器分配40个字节长度给b,并且把⾸元素⾸地址和符号b绑定起来。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。