如何给printf在C中的内存地址

这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。

指针解决了一些编程中基本的问题。

第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。

第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。

第三,有些操作必须使用指针。如操作申请的堆内存。还有:C语言中的一切函数调用中,值传递都是“按值传递”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。

我们指知道:C语言中的数组是指 一类 类型,数组具体区分为  int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。

我们也必须知道:任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。

因此:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

为什么程序中的数据会有自己的地址?

弄清这个问题我们需要从操作系统的角度去认知内存。

电脑维修师傅眼中的内存是这样的:内存在物理上是由一组DRAM芯片组成的。

而作为一个程序员,我们不需要了解内存的物理结构,操作系统将RAM等硬件和软件结合起来,给程序员提供的一种对内存使用的抽象。,这种抽象机制使得程序使用的是虚拟存储器,而不是直接操作和使用真实存在的物理存储器。所有的虚拟地址形成的集合就是虚拟地址空间。 

程序员眼中的内存应该是下面这样的。

也就是说,内存是一个很大的,线性的字节数组(平坦寻址)。每一个字节都是固定的大小,由8个二进制位组成。最关键的是,每一个字节都有一个唯一的编号,编号从0开始,一直到最后一个字节。如上图中,这是一个256M的内存,他一共有256x  = 个字节,那么它的地址范围就是 0 ~  。

由于内存中的每一个字节都有一个唯一的编号,因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针就是这样形成的。

 为了获得更好的阅读体验,请访问原博客地址。

限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

实现一个基于命令行的简单数据库系统,要求能建立数据库表,能对单表进行数据导入,插入,查询,更新,删除。

a) -c 文件路径名 根据指定位置的文件内语句建立一个数据库表

b) -i 数据库表名 数据文件路径名 从指定文本文件中导入数据到数据库的表中

c) -s 文件路径名 从指定文本文件中读取语句执行查询操作

d) -u 文件路径名 从指定文本文件中读取语句执行更新操作

e) -d 文件路径名 从指定文本文件中读取语句执行删除操作

f) -h 帮助信息,提示各个参数的格式和含义

h) -index 0/1 0 表示关闭索引功能,1 表示打开索引功能,即在接下来的查询、更新、删除操作中使用索引。

具体文件格式及项目要求参见附件:

我们先不管背后复杂的数据结构,先来实现一个简单的命令接受解析器,来开始我们项目的第一步。

我们用一个char数组input来存储用户的指令。

main函数中while(true)表示该循环将一直进行到用户手工退出为止。

每一次循环中,我们先打印“DB=>”,然后等待用户输入,当用户输入指令并敲击回车时,gets(input)函数会将用户的输入存储到input变量中。

接受到命令以后,我们简单的将命令本身打印出来,至此一次循环就结束了,进入下一次循环:打印“DB=>”,等待命令输入,处理命令,下一次循环。。。

这样一个最简单的命令接收器就完成了。

我们希望程序根据接收到的不同命令执行不同的操作,那么我们就需要对命令进行解析,从而根据解析的结果做不同的处理。

//输入的第一个字符应为‘-’,否则返回-1

这里我们写了一个parseInpute函数来对命令进行解析,将用户输入分成了command和param两部分。command即-c -s等,param即文件路径等。

得到command以后,我们就可以方便地根据不同的command来做不同的操作。

//输入的第一个字符应为‘-’,否则返回-1

在distribute函数中,我们根据不同的command做不同的操作,这里只是简单打印了命令的含义以及相应的param,效果如下:

需要注意的是strcmp函数的返回值:

    • 当s1<s2时,返回为负数 注意不是-1
    • 当s1>s2时,返回正数 注意不是1

我要回帖

更多关于 C位 的文章

 

随机推荐