C语言和内存关系
本人C初学者,学到指针部分。请问,内存是否由无数个地址组成,指针指向地址,比如我们在电脑上运行各种程序,软件,或者游戏,是不是靠无数个指针把这些程序指到内存上去然后在内存...
本人C 初学者,学到指针部分。请问,内存是否由无数个地址组成,指针指向地址,比如我们在电脑上运行各种程序,软件,或者游戏,是不是靠无数个指针把这些程序指到内存上去然后在内存里面工作? 谢谢。。。
展开
3个回答
展开全部
恩,不错,可以这么说。
软件是怎么到内存并运行的呢?这个内存地址有何关系呢?
就拿任何一个windows程序来说,程序的入口点都是WinMain,这个WinMain在内存的什么地方呢?
在win7之前,只要你不修改链接器选项,这个WinMain一定是在内存的0X400000.
任何程序都需要操作系统内核支持,操作系统的内核的地址是0X80000000~4GB之间。
其他的库文件,比如C语言中支持字符串函数(如strcap)的库在400000与80000000之间。
可见,硬盘上的exe文件在进入内存之前,就已经明确知道自己会在内存的什么位置。
当然,这里有个4GB虚拟地址空间的概念:在32位系统中,系统为每个exe文件分配了一个4GB的虚拟空间,无论你是否安了4G内存。很显然,很多库,特别是系统内核,都是能共用的,所以你的系统能同时运行多个需要4GB虚拟空间的程序。
这个和C语言的指针有何关系呢?
举个简单例子:每个exe文件一般需要系统的dll文件才能运行,在exe文件的开头,有一个表记录了该exe需要那个dll中的哪个函数。由于dll地址是固定的,函数地址为相对于该dll地址的偏移地址,所以exe能在4GB空间中找到它需要的函数。你可以通过exe文件的基地址找到这个表,这个基地址在每个程序运行时由系统交给了exe程序,这个基地址就是一个指针。然后你能修改这个指针,所以以后每次调用这个函数时,程序将转跳到你自己的代码中。这其实就是c语言中的函数指针的概念。
在汇编语言中是没有指针的,因为指针本质上就是内存中的地址。exe文件和dll文件中各种基地址和偏移地址,就是你所说的“无数个指针”。
当然,以上解释是非常浅薄的,指针、内存、地址的概念是简单的,但在实际的系统中却非常复杂。如果你想了解一些底层的,本质的问题,可以在学习C语言之后参考一些汇编语言,windows底层编程等书籍,比如《Windows via C/C++ 第五版》《Intel汇编语言程序设计 第五版》就是两本很好的入门教程。
软件是怎么到内存并运行的呢?这个内存地址有何关系呢?
就拿任何一个windows程序来说,程序的入口点都是WinMain,这个WinMain在内存的什么地方呢?
在win7之前,只要你不修改链接器选项,这个WinMain一定是在内存的0X400000.
任何程序都需要操作系统内核支持,操作系统的内核的地址是0X80000000~4GB之间。
其他的库文件,比如C语言中支持字符串函数(如strcap)的库在400000与80000000之间。
可见,硬盘上的exe文件在进入内存之前,就已经明确知道自己会在内存的什么位置。
当然,这里有个4GB虚拟地址空间的概念:在32位系统中,系统为每个exe文件分配了一个4GB的虚拟空间,无论你是否安了4G内存。很显然,很多库,特别是系统内核,都是能共用的,所以你的系统能同时运行多个需要4GB虚拟空间的程序。
这个和C语言的指针有何关系呢?
举个简单例子:每个exe文件一般需要系统的dll文件才能运行,在exe文件的开头,有一个表记录了该exe需要那个dll中的哪个函数。由于dll地址是固定的,函数地址为相对于该dll地址的偏移地址,所以exe能在4GB空间中找到它需要的函数。你可以通过exe文件的基地址找到这个表,这个基地址在每个程序运行时由系统交给了exe程序,这个基地址就是一个指针。然后你能修改这个指针,所以以后每次调用这个函数时,程序将转跳到你自己的代码中。这其实就是c语言中的函数指针的概念。
在汇编语言中是没有指针的,因为指针本质上就是内存中的地址。exe文件和dll文件中各种基地址和偏移地址,就是你所说的“无数个指针”。
当然,以上解释是非常浅薄的,指针、内存、地址的概念是简单的,但在实际的系统中却非常复杂。如果你想了解一些底层的,本质的问题,可以在学习C语言之后参考一些汇编语言,windows底层编程等书籍,比如《Windows via C/C++ 第五版》《Intel汇编语言程序设计 第五版》就是两本很好的入门教程。
追问
谢谢,大概意思我已明白,能不能理解说内存容量多少Gb 就是有多少地址?GB 越多,地址越多,能够处理的任务就越多?
展开全部
不是,指针其实是保存以地址为数据的变量,如果说数据是货物,内存空间是盒子,那么指针就是一个里面装有某个盒子编号的盒子,平常程序代码一般保存在硬盘里,运行程序时程序先被加载到内存,然后内存里的数据被送到寄存器供cpu读取执行,此时指针只是某个内存的地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存是由许多存储单元组成,这些存储单元有十六进制编号,C语言中的指针变量存放的就是这些编号,存放哪个编号我们就说指向了以该编号为地址的变量。
程序,软件等运行之前,一定是先从硬磁盘存储器加载到内存中,因为CPU直接能够访问的不是硬盘而是内存,然后CPU从内存中读取数据到CPU的寄存器中开始执行。
程序,软件等运行之前,一定是先从硬磁盘存储器加载到内存中,因为CPU直接能够访问的不是硬盘而是内存,然后CPU从内存中读取数据到CPU的寄存器中开始执行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询