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 *)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绑定起来。

C语言如何操作内存的更多相关文章

  1. Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

    Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...

  2. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  3. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  4. C 语言文件操作

    C 语言文件操作 1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不 ...

  5. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  6. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  7. C语言IO操作总结

    C语言IO操作总结C程序将输入看做字节流,流的来源是文件.输入设备.或者另一程序的输入:C程序将输出也看做字节流:流的目的是文件.视频显示等: 文件处理:1 :fopen("filename ...

  8. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  9. C语言中的内存管理

    开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...

随机推荐

  1. CIC许可更新

    打开IA软件,点击软件中的[License],可以查看当前许可是否可用或者过期,如果过期,点击下方的[Load License],选择最新的I3许可文件加载,重启电脑.

  2. 【leetcode】K-th Symbol in Grammar

    题目如下: 解题思路:直接把每行的数据计算出来肯定是不行的,因为N最大是30,那个第N行长度就是2^30次方,这显然不可取.那么就只能找规律了,我采取的是倒推法.例如假如我们要求出第四行第七个元素的值 ...

  3. 大数减法(A - B Problem Plus)问题

    解题思路 flagA为0表示A为正整数,为-1表示A为负整数: flagB为0表示B为正整数,为2表示B为负整数: 而 flag = flagA + flagB. 1.当 flag == 0 表示数A ...

  4. awk基础学习

    2019-12-20 需要巧记,很多格式,学习难度:grep.sed.awk awk知识概述 1三剑客awk命令介绍2三剑客awk命令执行原理语法结构3三剑客awk命令实操练习查询替换信息排除(取反) ...

  5. jq刷新页面

    //页面加载时绑定按钮点击事件$(function(){    $("#按钮id").click(function(){        refresh();    });});// ...

  6. html显示高亮c++

    配色与Devc++ 的classic plus 相同 输入文件名即可,输出在out.htm中 #include<bits/stdc++.h> #include<windows.h&g ...

  7. sh_05_超市买苹果

    sh_05_超市买苹果 # 1. 定义苹果的单价 price = 8.5 # 2. 挑选苹果 weight = 7.5 # 3. 计算付款金额 money = weight * price # 4. ...

  8. Android - Gradle架构中使用的“.so”库

    Android使用Gradle架构的Android应用,需要对.so库做特殊的处理,因为会找不到,就会导致编译正确,使用错误:常见的使用情况是根据不同的cpu,有不同的库,包括:armeabi,mip ...

  9. 3D Computer Grapihcs Using OpenGL - 06 Vertex and Fragment Shaders

    从这里就接触到了可编程图形渲染管线. 下面介绍使用Vertex Shader (顶点着色器)和 Fragment Shader(像素着色器)的方法. 我们的目标是使用这两个着色器给三角形填充绿色. 添 ...

  10. [CSP-S模拟测试]:木叶下(图论)

    题目传送门(内部题77) 输入格式 第一行一个整数$n$,表示原先的树的点数接下来$n-1$行每行两个整数$a,b$,表示原先的树上的$n-1$条边,保证这$n-1$条边形成一棵树. 接下来一行一个整 ...