C语言精讲之内存

合集下载

amp在c语言中的意思

amp在c语言中的意思

amp在c语言中的意思AMP在C语言中通常是指“地址、内存和指针”。

它是C语言中一种重要的概念,与内存管理和数据结构密切相关。

在C语言中,通过使用AMP,我们可以访问和操作内存中的数据,从而实现更高级别的编程功能。

一、地址地址是计算机内存空间中的位置,用于标识内存单元。

在C语言中,我们可以通过指针变量来存储地址,进而访问该地址所指向的内存单元。

指针变量是一个变量,其值为另一个变量的地址。

通过指针变量,我们可以间接地访问其他变量或数据结构中的数据。

二、内存内存是计算机系统中的一种重要组件,用于存储和访问程序运行所需的数据。

在C语言中,内存管理是一个重要的主题,包括分配、释放和引用内存。

通过使用AMP,我们可以有效地管理内存,避免内存泄漏和溢出等问题。

三、指针指针是一种特殊的变量,它存储了一个地址值,该地址值指向内存中的某个位置。

通过指针,我们可以间接地访问和操作数据,从而实现更高级别的编程功能。

在C语言中,指针是一种非常强大的工具,但如果不正确地使用,也可能会导致程序出现错误和崩溃。

综上所述,AMP在C语言中的意思是指通过地址、内存和指针来访问和操作内存中的数据。

它是C语言中一种重要的概念,与内存管理和数据结构密切相关。

在使用AMP时,我们需要正确地使用指针变量来存储地址,并确保正确地管理内存,以避免程序出现错误和崩溃。

在实际应用中,AMP也经常与其他数据结构和算法相结合,实现更高级别的编程功能。

例如,可以使用指针来创建链表、栈、队列等数据结构,并通过内存管理来实现动态分配和释放内存的功能。

此外,AMP在处理文件和网络编程等领域也具有广泛的应用。

值得注意的是,正确地使用AMP需要深入理解C语言的内存管理机制和指针运算规则。

如果不正确地使用AMP,可能会导致程序出现各种错误和问题,包括内存泄漏、崩溃和数据损坏等。

因此,在编程时需要谨慎使用AMP,并确保对相关概念有深入的理解。

此外,随着现代编程技术的发展,AMP在某些情况下可能已经不再是必需的概念。

C语言实现大小端存储

C语言实现大小端存储

C语言实现大小端测试发表于2012 年5 月27 日C语言实现大小端测试大小端简介大小端是计算机存储的两种方式。

小端表示法(Little-endian):所谓的小端模式,是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

如:16bit宽的数0×1234内存地址存放内容▪0×4000 0×34▪0×4001 0×12而32bit宽的数0×12345678内存地址存放内容▪0×4000 0×78▪0×4001 0×56▪0×4003 0×34▪0×4004 0×12大端表示法(Big-endian):所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。

如:16bit宽的数0×1234内存地址存放内容▪0×4000 0×12▪0×4001 0×34而32bit宽的数0×12345678内存地址存放内容▪0×4000 0×12▪0×4001 0×34▪0×4003 0×56▪0×4004 0×78C语言判断方法联合体union(谭浩强版的c语言教程称其为共用体)的存放顺序是所有成员都从低地址开始存放,而且共用相同的地址(不懂这个特性的不妨谷歌一下,百度两下),利用这一特性可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

程序如下:测试数据用16bit的0×1234,为第9行所示1.#include <stdio.h>2.int main()3.{4.union check5. {6.int a;7.char b[2];8. }s;9. s.a=0×1234;10.printf(“数据在内存中:\n”);11.printf(“变量:%8s\t%8s\t%8s\n”,”s.b[0]“,”s.b[1]“,”s.a”);12.printf(“地址:%8p\t%8p\t%8p\n”,&s.b[0],&s.b[1],&s.a);13.printf(“数据:%8x\t%8x\t%8x\n”,s.b[0],s.b[1],s.a);14.if(s.b[0]==0×12)15.printf(“大端模式\n”);16.else17.printf(“小端模式\n”);18.return 0;19.}结果同时还可以测试整型的位宽,程序不变,换一个测试数据即可程序如下:测试数据用32bit的0×12345678,为第9行所示1.#include <stdio.h>2.int main()3.{4.union check5. {6.int a;7.char b[2];8. }s;9. s.a=0×12345678;10.printf(“数据在内存中:\n”);11.printf(“变量:%8s\t%8s\t%8s\n”,”s.b[0]“,”s.b[1]“,”s.a”);12.printf(“地址:%8p\t%8p\t%8p\n”,&s.b[0],&s.b[1],&s.a);13.printf(“数据:%8x\t%8x\t%8x\n”,s.b[0],s.b[1],s.a);14.if(s.b[0]==0×12)15.printf(“大端模式\n”);16.else17.printf(“小端模式\n”);18.return 0;19.}结果如果将测试数据改为0×1234567890,结果就不一样了哦。

C语言程序设计全套教学教程完整版电子课件最全ppt电子教案

C语言程序设计全套教学教程完整版电子课件最全ppt电子教案

上一页 下一页
目录
8.1 指针的概念、定义和引用 8.1.1 指针的概念 8.1.2 指针变量的定义 8.1.3 指针变量的引用 8.2 指针与函数 8.2.1 指针变量作函数参数 8.2.2 返回值为指针的函数 8.2.3 通过指针调用函数
上一页 下一页
Hale Waihona Puke 目录8.3 指针与数组 8.3.1 指针与数组的关系 8.3.2 数组名作函数参数的指针解释 8.3.3 指针数组 8.3.4 多级指针 8.4 指针与字符串 8.4.1 字符串的表示形式 8.4.2 字符串指针作函数参数
2.汇编语言
汇编语言的指令与机器语言的指令基本上保持了一一对应的关系。与 机器语言比起来,汇编语言易记、易读、易检查、易修改,但却不能 被计算机直接识别和执行,必须由翻译程序翻译成机器语言程序后才 能执行。汇编语言仍然是面向特定计算机的语言,也仍然是低级语言
下一页
返回
1.1 程序设计语言概述
3.高级语言 高级语言是接近人类自然语言和数学语言的程序设计语言,具有以下
上一页 下一页
目录
5.2 do-while语句 5.3 for语句 5.4 break和continue语句 5.5 多重循环 5.6 综合应用举例 第6章 数组 6.1 数组概述 6.2 一维数组
上一页 下一页
目录
6.2.1 一维数组的定义 6.2.2 一维数组的引用 6.2.3 一维数组的初始化 6.2.4 一维数组的程序举例 6.3 二维数组 6.3.1 二维数组的定义 6.3.2 二维数组的引用 6.2.3 二维数组的初始化
翻译成目标程序,然后执行该目标程序。解释方式是把源程序逐句翻
上一页 下一页 返回
1.1 程序设计语言概述

C语言程序设计的特点

C语言程序设计的特点

C语言程序设计的特点C语言是一种通用的程序设计语言,它具有以下几个显著的特点。

本文将详细介绍C语言程序设计的特点,并分析其在实际应用中的优势。

一、简洁高效C语言具有简洁的语法和丰富的表达能力,使得程序编写更加高效。

它提供了丰富的基本数据类型、操作符和控制结构,可以灵活地处理各种计算需求。

同时,C语言还提供了丰富的库函数,使得程序员可以快速调用各种功能模块,减少了编程的工作量。

二、可移植性强C语言的设计注重跨平台的可移植性,编写的C程序在不同的操作系统和硬件上都能够正常运行。

这使得C语言成为了广泛应用于嵌入式系统和操作系统开发的首选语言。

C语言通过提供标准的库函数和底层的操作接口,实现了高度的兼容性,简化了程序的开发和维护过程。

三、高效的内存管理C语言通过手动管理内存的方式,提供了高效的内存控制能力。

程序员可以通过动态分配和释放内存的方式,根据需求灵活地管理内存空间。

这种特点在对内存需求较大或需要频繁申请和释放内存的程序中尤为重要,有效提高了程序的性能和资源利用率。

四、底层编程能力C语言具有强大的底层编程能力,可以直接访问底层硬件和操作系统的接口。

通过使用C语言可以实现对底层硬件的完全控制,例如操纵寄存器、直接操作内存等。

这使得C语言在嵌入式开发、驱动程序开发等领域中得到广泛应用。

五、丰富的扩展能力C语言支持函数的模块化编程,可以将代码模块化、组织成库,方便代码的重用和维护。

此外,C语言还可以通过结构体和指针的使用,实现数据的封装和灵活的数据操作。

通过使用C语言的所有扩展能力,可以提高程序的可读性、可维护性和可拓展性。

六、广泛的应用领域由于其简洁、高效和可移植性等特点,C语言广泛应用于各个领域。

包括系统软件开发、网络编程、嵌入式开发、游戏开发等。

正是因为广泛的应用领域,使得C语言在深度学习、人工智能等新兴技术的开发中也占有一席之地。

综上所述,C语言程序设计具有简洁高效、可移植性强、高效的内存管理、底层编程能力、丰富的扩展能力和广泛的应用领域等特点。

c语言中free的用法

c语言中free的用法

c语言中free的用法c语言中free的用法free()与malloc()函数配对使用,释放malloc函数申请的动态内存。

下面店铺就跟你们详细介绍下c语言中free的用法,希望对你们有用。

c语言中free的用法如下:一、malloc()和free()的基本概念以及基本用法:1、函数原型及说明:void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。

如果分配失败,则返回一个空指针(NULL)。

关于分配失败的原因,应该有多种,比如说空间不足就是一种。

void free(void *FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法:其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:程序代码:// Code...char *Ptr = NULL;Ptr = (char *)malloc(100 * sizeof(char));if (NULL == Ptr){exit (1);}gets(Ptr);// code...free(Ptr);Ptr = NULL;// code...就是这样!当然,具体情况要具体分析以及具体解决。

比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。

3、关于函数使用需要注意的一些地方:A、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。

如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。

释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

c语言中delete的用法

c语言中delete的用法

c语言中delete的用法在C语言中,delete是一个关键字,用于释放动态分配的内存。

delete关键字通常和new关键字配合使用,用于释放通过new关键字动态分配的内存空间,避免内存泄漏。

在C语言中,内存空间可以通过两种方式进行分配:静态分配和动态分配。

静态分配的内存空间在程序编译时就已经确定了大小,而动态分配的内存空间则在程序运行时根据需要进行分配。

C语言中,new关键字用于动态分配内存空间,其语法为:指针变量 = new 数据类型。

通过new关键字动态分配的内存空间在不再使用时,需要使用delete关键字进行释放,以避免内存泄漏。

delete关键字的语法为:delete 指针变量。

它会释放指针变量所指向的内存空间,并将指针变量置为空。

使用delete关键字需要遵循以下几点注意事项:1. delete关键字只能释放通过new关键字分配的内存空间。

如果使用delete关键字释放静态分配的内存空间或者未动态分配内存空间的指针,会导致程序崩溃或者未定义的行为。

2. delete关键字必须在内存空间不再使用时调用,否则会导致内存泄漏。

通过delete关键字释放内存空间后,指针变量不再指向有效的内存空间,因此在释放内存后应将指针变量置为空,以避免出现悬空指针的情况。

3. 使用delete关键字释放内存空间后,释放的内存空间不再属于程序,其内容可以被其他程序占用或修改。

因此,在使用delete关键字释放内存空间后,最好将指针变量赋值为NULL,以防止对已释放内存的误操作。

总之,通过delete关键字可以释放使用new关键字动态分配的内存空间,避免内存泄漏和程序崩溃。

使用delete关键字需要遵循相关的注意事项,以确保正确释放内存空间并避免程序的潜在问题。

全国计算机二级c语言学习指南课件与历年真题精讲精析 第16章

全国计算机二级c语言学习指南课件与历年真题精讲精析 第16章

4)“wb”为写而打开一个二进制文件。其余功能与 “w”相似,可以从指定位置开始写。 5)“a”为在文件后面添加数据而打开文本文件。这时,
如果指定的文件不存在,系统将用在fopen调用中指
定的文件名建立一个新文件;如果指定的文件已存在, 则文件中原有的内容将保持,新的数据写在原有内容
之后。
6)“ab”为在文件后面添加数据而打开一个二进制文 件。其余功能与“a”相同。
“r+”相同。只是在读和写时,可以由位置函数设置读 和写的起始位置,也就是说不一定从文件的起始位置 开始读和写。
9)“w+”首先建立一个新文件,进行写操作,随后 可以从头开始读。如果指定的文件已存在,则原有的 内容将全部消失。
10)“wb+”功能与“w+”相同,只是在随后的读和
写时,可以由位置函数设置读和写的起始位置。 11)“a+”功能与“a”相同,只是在文件尾部添加新
3、如果在未读满n-1个字符之时,已读到一个换行符或一 个EOF(文件结束标志),则结束本次读操作。
二、fputs函数 1、fputs函数用来把字符串输出到文件中。格式如下: fputs(str,fp);
2、fp是文件指针;str是待输出字符串;可以是字符串常量、
指向字符串的指针或存放字符串的字符数组名等。 3、用此函数进行输出时,字符串中最后的‘\0’并不输出,
16.2 文件指针
定义文件指针类型指针变量的一般形式: FILE *指针变量名;
16.3 打开文件 1、调用C语言提供的库函数fopen“打开”文件: fopen (文件名,文件使用方式);
函数返回一个指向FILE类型的指针。如:
FILE *fp; fp=fopen(“file_a”,”r”);

c语言free函数

c语言free函数

c语言free函数free函数是C语言中的内存分配函数,它可以释放由malloc函数所分配的内存空间,并且返回动态内存空间给操作系统。

free函数是有必要的,因为malloc函数分配了一块内存,但是在程序使用完毕后,就可能会占用不必要的内存空间,而free函数就可以将其释放,从而让系统有更多的内存可以用来运行其它程序。

free函数的声明如下:void free(void* ptr); 它有一个参数 ptr,这是malloc函数返回的指针,我们要释放它指向的内存空间,ptr必须是正确的,否则会导致程序崩溃。

原理上来说,free函数是将已经分配的内存块标记为可用,并不是真正意义上的释放,因为程序退出时,系统会将所有动态分配的内存都释放掉,所以free函数实际上只是让系统知道这块内存可以被分配给别的程序使用而已。

调用free函数的步骤如下: 1. 首先,需要得到一个指向动态分配的内存空间的指针,这个指针可以通过malloc函数获得; 2. 然后,将这个指针传入free函数中,free函数会将这块内存标记为可用; 3. 最后,将指针赋值为NULL,以免后续使用时指向未知的内存空间。

free函数一般被用来释放动态分配的内存,但是,也可以用来释放静态分配的内存,即用malloc函数分配的内存,但是因为这块内存是在程序结束后才会被释放掉,所以这时调用free函数没有太大意义。

free函数也可以用来释放全局变量分配的内存,这时候,free函数会将全局变量的内存空间释放掉,并将指针赋值为NULL,以防止后续使用时指向未知的地址。

free函数不仅可以释放malloc函数所分配的内存,还可以释放由calloc函数分配的内存,realloc函数也可以使用free函数来释放内存,其中calloc函数和realloc 函数在程序中用来改变内存空间大小,当然,释放内存也要配合这两个函数来使用总而言之,free函数是C语言中的内存分配函数,它可以释放由malloc函数所分配的内存空间,并且返回动态内存空间给操作系统,以便系统可以分配给其它程序使用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言专题精讲篇--内存目录C语言专题精讲篇--内存 (1)第一部分:章节介绍 (3)4.1.1.程序运行为什么需要内存 (3)4.1.2.程序运行为什么需要内存 (3)本节从本质上分析了计算机程序在计算机中是如何运行的,通过冯诺依曼结构和哈佛结构的对比,让大家对代码和数据之分有了清楚的认识。

这些认识有助于你对程序运行过程的分析,从而保证将来写出优秀的程序代码。

(3)4.1.4.内存编址和寻址、内存对齐 (3)4.1.5.C语言如何操作内存 (3)4.1.6.内存管理之结构体 (3)4.1.7.内存管理之栈 (4)4.1.8.内存管理之堆 (4)4.1.9、复杂数据结构 (4)第二部分:课程内容 (4)4.1.1.程序运行为什么需要内存 (4)4.1.1.1、计算机程序运行的目的 (4)4.1.1.2、计算机程序运行过程 (5)4.1.1.3、冯诺依曼结构和哈佛结构 (5)4.1.1.4、动态内存DRAM和静态内存SRAM (5)4.1.1.5、总结:为什么需要内存呢 (5)4.1.1.6、深入思考:如何管理内存(无OS时,有OS时) (6)4.1.3.位、字节、半字、字的概念和内存位宽 (6)4.1.3.1、什么是内存?(硬件和逻辑两个角度) (6)4.1.3.2、内存的逻辑抽象图(内存的编程模型) (7)4.1.3.3、位和字节 (7)4.1.3.4、字和半字 (7)4.1.3.5、内存位宽(硬件和逻辑两个角度) (7)4.1.4.内存编址和寻址、内存对齐 (8)4.1.4.1、内存编址方法 (8)4.1.4.2、关键:内存编址是以字节为单位的 (8)4.1.4.3、内存和数据类型的关系 (8)4.1.5.C语言如何操作内存 (9)4.1.6.内存管理之结构体 (10)4.1.6.1、数据结构这门学问的意义 (10)4.1.6.2、最简单的数据结构:数组 (11)4.1.6.3、数组的优势和缺陷 (11)4.1.6.4、结构体隆重登场 (11)4.1.6.5、题外话:结构体内嵌指针实现面向对象 (11)4.1.7、内存管理之栈(stack) (12)4.1.7.1、什么是栈 (12)1.4.7.2、栈管理内存的特点(小内存、自动化) (12)1.4.7.3、栈的应用举例:局部变量 (12)1.4.7.4、栈的约束(预定栈大小不灵活,怕溢出) (13)4.1.8、内存管理之堆(heap) (13)4.1.8.1、什么是堆 (13)4.1.8.2、堆管理内存的特点(大块内存、手工分配&使用&释放) (13)4.1.8.3、C语言操作堆内存的接口(malloc free) (14)4.1.8.4、堆的优势和劣势(管理大块内存、灵活、容易内存泄漏) (14)4.1.9、复杂数据结构 (14)4.1.9.1、链表、哈希表、二叉树、图等 (14)4.1.9.2、为什么需要更复杂的数据结构 (15)4.1.9.3、数据结构和算法的关系 (15)4.1.9.4、应该怎样学习这部分? (15)第一部分:章节介绍4.1.1.程序运行为什么需要内存本节从本质上分析了计算机程序在计算机中是如何运行的,通过冯诺依曼结构和哈佛结构的对比,让大家对代码和数据之分有了清楚的认识。

这些认识有助于你对程序运行过程的分析,从而保证将来写出优秀的程序代码。

4.1.2.程序运行为什么需要内存本节从本质上分析了计算机程序在计算机中是如何运行的,通过冯诺依曼结构和哈佛结构的对比,让大家对代码和数据之分有了清楚的认识。

这些认识有助于你对程序运行过程的分析,从而保证将来写出优秀的程序代码。

4.1.3.位、字节、半字、字的概念和内存位宽本节从逻辑上阐述内存的编程模型和逻辑认识,并且解释了内存单元的几个单位:位、字节、半字、字。

通过本节学习希望大家从逻辑上对内存有一个认知,先建立起来大的框架性概念。

4.1.4.内存编址和寻址、内存对齐本节重点讲述内存单元格和其地址的对应关系,同时讲了内存对齐的意义和重要性,试图带领大家对内存从逻辑和现实两个角度深入理解,以为后面的深入分析C语言特性打下基础。

4.1.5.C语言如何操作内存本节主要讲C语言语法中对内存的使用,包括:变量定义、指针、数组等C语言基本语法,讲述这些语法和内存之间的内在联系,试图引导大家从内存的角度来理解这些语法特性。

4.1.6.内存管理之结构体本节首先讲述数据结构的概念和意义,然后从数组讲起,使用数组的缺陷引出结构体,目的在于让大家明白结构体这种简单数据结构的内在,最后讲了通过结构体内嵌指针来实现面向对象,这是linux内核中常见的一种语法技巧。

4.1.7.内存管理之栈4.1.8.内存管理之堆4.1.9、复杂数据结构第二部分:课程内容4.1.1.程序运行为什么需要内存4.1.1.1、计算机程序运行的目的计算机为什么需要编程?编程已经编了很多年,已经写了很多程序,为什么还需要另外写程序?计算机有这个新的程序到底为了什么?程序的目的是为了去运行,程序运行是为了得到一定的结果。

计算机就是用来计算的,所有的计算机程序其实都是在做计算。

计算就是在计算数据。

所以计算机程序中很重要的部分就是数据。

计算机程序= 代码+ 数据计算机程序运行完得到一个结果,就是说代码+ 数据(经过运行后) = 结果从宏观上来理解,代码就是动作,就是加工数据的动作;数据就是数字,就是被代码所加工的东西。

那么可以得出结论:程序运行的目的不外乎2个:结果、过程用函数来类比:函数的形参就是待加工的数据(函数内还需要一些临时数据,就是局部变量),函数本体就是代码,函数的返回值就是结果,函数体的执行过程就是过程。

int add(int a, int b){return a + b;}// 这个函数的执行就是为了得到结果void add(int a, int b){int c;c = a + b;printf("c = %d.\n", c);}// 这个函数的执行重在过程(重在过程中的printf),返回值不需要int add(int a, int b){int c;c = a + b;printf("c = %d.\n", c);return c;}// 这个函数又重结果又重过程4.1.1.2、计算机程序运行过程计算机程序的运行过程,其实就是程序中很多个函数相继运行的过程。

程序是由很多个函数组成的,程序的本质就是函数,函数的本质是加工数据的动作。

4.1.1.3、冯诺依曼结构和哈佛结构冯诺依曼结构是:数据和代码放在一起。

哈佛结构是:数据和代码分开存在。

什么是代码:函数什么是数据:全局变量、局部变量在S5PV210中运行的linux系统上,运行应用程序时:这时候所有的应用程序的代码和数据都在DRAM,所以这种结构就是冯诺依曼结构;在单片机中,我们把程序代码烧写到Flash (NorFlash)中,然后程序在Flash中原地运行,程序中所涉及到的数据(全局变量、局部变量)不能放在Flash中,必须放在RAM(SRAM)中。

这种就叫哈佛结构。

4.1.1.4、动态内存DRAM和静态内存SRAMDRAM是动态内存,SRAM是静态内存。

详细细节自己baidu4.1.1.5、总结:为什么需要内存呢内存是用来存储可变数据的,数据在程序中表现为全局变量、局部变量等(在gcc中,其实常量也是存储在内存中的)(大部分单片机中,常量是存储在flash中的,也就是在代码段),对我们写程序来说非常重要,对程序运行更是本质相关。

所以内存对程序来说几乎是本质需求。

越简单的程序需要越少的内存,而越庞大越复杂的程序需要更多的内存。

内存管理是我们写程序时很重要的话题。

我们以前学过的了解过的很多编程的关键其实都是为了内存,譬如说数据结构(数据结构是研究数据如何组织的,数据是放在内存中的)和算法(算法是为了用更优秀更有效的方法来加工数据,既然跟数据有关就离不开内存)。

4.1.1.6、深入思考:如何管理内存(无OS时,有OS时)对于计算机来说,内存容量越大则可能性越大,所以大家都希望自己的电脑内存更大。

我们写程序时如何管理内存就成了很大的问题。

如果管理不善,可能会造成程序运行消耗过多的内存,这样迟早内存都被你这个程序吃光了,当没有内存可用时程序就会崩溃。

所以内存对程序来说是一种资源,所以管理内存对程序来说是一个重要技术和话题。

先从操作系统角度讲:操作系统掌握所有的硬件内存,因为内存很大,所以操作系统把内存分成1个1个的页面(其实就是一块,一般是4KB),然后以页面为单位来管理。

页面内用更细小的方式来以字节为单位管理。

操作系统内存管理的原理非常麻烦、非常复杂、非常不人性化。

那么对我们这些使用操作系统的人来说,其实不需要了解这些细节。

操作系统给我们提供了内存管理的一些接口,我们只需要用API即可管理内存。

譬如在C语言中使用malloc free这些接口来管理内存。

没有操作系统时:在没有操作系统(其实就是裸机程序)中,程序需要直接操作内存,编程者需要自己计算内存的使用和安排。

如果编程者不小心把内存用错了,错误结果需要自己承担。

再从语言角度来讲:不同的语言提供了不同的操作内存的接口。

譬如汇编:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010),非常麻烦;譬如C语言:C语言中编译器帮我们管理直接内存地址,我们都是通过编译器提供的变量名等来访问内存的,操作系统下如果需要大块内存,可以通过API(malloc free)来访问系统内存。

裸机程序中需要大块的内存需要自己来定义数组等来解决。

譬如C++语言:C++语言对内存的使用进一步封装。

我们可以用new来创建对象(其实就是为对象分配内存),然后使用完了用delete来删除对象(其实就是释放内存)。

所以C++语言对内存的管理比C要高级一些,容易一些。

但是C++中内存的管理还是靠程序员自己来做。

如果程序员new了一个对象,但是用完了忘记delete就会造成这个对象占用的内存不能释放,这就是内存泄漏。

Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。

这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。

如果我的程序申请了内存,使用完成后忘记释放,则虚拟机会帮我释放掉这些内存。

听起来似乎C# java等语言比C/C++有优势,但是其实他这个虚拟机回收内存是需要付出一定代价的,所以说语言没有好坏,只有适应不适应。

当我们程序对性能非常在乎的时候(譬如操作系统内核)就会用C/C++语言;当我们对开发程序的速度非常在乎的时候,就会用Java/C#等语言。

4.1.3.位、字节、半字、字的概念和内存位宽4.1.3.1、什么是内存?(硬件和逻辑两个角度)从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。

相关文档
最新文档