[转]解读C指针(1)——内存与地址

原文地址:http://blog.csdn.net/czmpersist/article/details/9288203

计算机现在功能虽然强大,但究其实质是0与1的变换,循环往复,以至无穷,故能成其大。正如老子所说“一生二,二生三,三生万物”、“世界万物生于有,有生于无”。所以在学习计算机课程的过程中,要劳劳掌握基础知识,掌握根本,然后再去求变,才能以不变应万变,方为上策。

内存与地址

在介绍指针之前,先让我来讲一讲计算机内存与地址。计算机内存可以看作是一辆火车,我们知道火车有很多节车厢,每一节车厢都有车厢编号(坐过火车的人都知 道),每一节车厢就可比喻为计算机的一块内存,车厢里面有座位号,通过座位号就可以唯一的确定一个座位,座位号就好在这一个内存块的偏移量,通过它可以唯 一确定的数据存储的位置。

注意,内存中的每个位置由一个独一无二的地址标识,内存中的每个位置都包含一个值。

现在举例说明内存中数据存储,如下表,表中加粗边框部分表示内存中实际存储的数据,无边框部分表示内存单元的地址。


10000


10004


10006


10008


10012


10016


110


-1


16


1234567890


10000


10008

仔细的人也许会看到,对-1或16只占了两个字节,可粗略看作为short int类型数据, 110在内存中占了4个字节,可粗略看作是int类型,而1234567890则可粗略看作是浮点型数据,所以应该了解虽然是同样一块地址,也可能存放不同类型的数据。

如果你能记住一个值的存储地址,你就可能根据这个地址取得这个值。但是要记住所有这些地址实在是太笨拙了(因为内存的地址并不像上表中表示的那么简单), 所以高级语言所提供的特性之一就是通过名字而不是地址来访问内存的位置。下面这张表与上表相同,但这次使用名字来代替地址。


a


b


c


d


e


f


110


-1


16


1234567


10000


10008

从上表中可以看出,当地址抽象成我们比较容易接受的名字时,对编程来说就变得简单,这些名字就是传说中的变量。不过有一点非常重要,你必须记住,名字与内存位置之间关联并不是硬件所提供的,它是由编译器为我们实现的。所有的这些变量给了我们一种更方便的方法记住地址——硬件仍然通过地址访问内存位置

好了,我们再来看看上面的两张表,我有一个问题,对于变量e中存储的内容到底代表一个值还是一个地址呢?

问题很简单,不能确定。

例1:

int a = 110;

int *e = &a;

例1中e代表一个地址,这个地址指向了整型变量a。

例2

int e = 10000;

例2中e则代表一个值。

我们已经知道定义变量时需要类型,编译器实现了变量与内存位置之间关联,那变量的类型又是干什么呢?变量名相当于帮我们找到了那个内存,而变量类型则告诉编译器从变量所指向的那个内存位置起取几个字节。如int a =110; 则是从10000(a对应内存地址)起取4个字节,所以从10000到10003这段地址就是变量a存储的空间,从而变量a共有232个取值。

而short int b = -1;代表从10004开始取sizeof(short int)个字节,也就是10004、10005这2个字节。其他的可以以此类推。

针对类型我们可以这样理解,还是拿坐火车为例,当一个出行的时候,买一张票就可以,这种情况相当于(char类型);某一天刚好和女朋友出去旅游,买一张票显然不够了,就得买2张票(short int类型);如果一个宿舍4个人准备去旅游显示就得4张票(int,float类型);以此类推。火车相对不同的人不同需求分配座位,内存同样根据不同的变量分配不同的内存空间。理解了这些,对于复杂的类型如数组、结构体、联合体变量的定义内存分配就明白了。

以上这些是通过参考《C和指针》这本书,经过自己的一些编程体会所总结的,比如以火车来比喻内存之类。我写文章的目的,一方面是对自己所学的一种总结,另 一方面是或许那些对指针感兴趣的朋友,而又迷惑的朋友有一点小小的帮助。在书写过程中如果有什么错误或者误解大家,还望大家不要吝啬自己的建议,在文章下 留言,我会努力做好的!

欲知后事如何,请听下回分解!

时间: 2024-11-07 00:36:20

[转]解读C指针(1)——内存与地址的相关文章

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名(转)

1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名. 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一

C指针与内存

C指针与内存 指针是C / C++ 中重要的构造类型,指针赋予了C / C++程序直接访问和修改内存的能力.C / C++的许多重要应用,如编译.OS.嵌入式开发都依赖于这种能力. 冯诺依曼体系的计算机内存存储指令和数据,我们可以将其抽象为指令区和数据区(当然实际情况要复杂得多).数据区中包含栈(stack)和堆(heap)区,栈区的数据由编译器管理而堆区数据则由程序员管理. 由于指令同样存在于内存中,那么函数在内存中也会拥有地址(指针). 函数指针相对于函数名来说 可以在运行期动态地选择调用的

指针以及内存分配

原文:http://blog.csdn.net/bizhu12/article/details/6532235 1. 指针很灵活,这使得指针很难管理,在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据,值得注意的是,定义指针时指针会随机指向一块内存,如int  *p;p会指向一块不为空的内存,相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空"

对象布局已知时 C++ 对象指针的转换时地址调整

在我调试和研究 netscape 系浏览器插件开发时,注意到了这个问题.即,在对象布局已知(即对象之间具有继承关系)时,不同类型对象的指针进行转换(不管是隐式的从下向上转换,还是强制的从上到下转换)时,编译器会根据对象布局对相应的指针的值进行调整.不管是 microsoft 的编译器,还是 gcc 编译器都会做这个动作,因为这和 C++ 对象模型有关. 举一个简单的例子,如下代码: #include <stdio.h> class A { public: int x; void foo1()

c++中指针的内存申请和内存释放问题

C++中指针在new和delete操作的时候对内存堆都做了些什么呢,以下解: 1.指针的new操作: 指针在new之后,会在内存堆中分配一个空间,而指针中存放的是这个空间的地址.如: void main(){ int *p = new int(4); cout << p << endl; cout << *p << endl; } 输出为: 0x00431BF0 4 分别为分配的空间地址和地址内存放的值. 如果写为: void main(){ int *p

Delphi 的内存操作函数(2): 给数组指针分配内存

静态数组, 在声明时就分配好内存了, 譬如: var   arr1: array[0..255] of Char;   arr2: array[0..255] of Integer; begin   ShowMessageFmt('数组大小分别是: %d.%d', [SizeOf(arr1), SizeOf(arr2)]);   {数组大小分别是: 512.1024} end; 对静态数组指针, 虽然在声明之处并没有分配内存, 但这个指针应该分配多少内存是有定数的. 这种情况, 我们应该用 Ne

&#160;C语言中让人头痛的指针和内存

指针:也是变量,存放变量的地址. 指针是变量的一个间接,变量是内存的一个间接. 虚拟内存中地址总线确定了你能访问的内存空间. 32位cpu最大的虚拟内存: 2^32 = 4 GB 所以32位的XP使用8G内存并没有什么用. 指针存放的变量地址是一个十六进制的数据表示的一组数据,而并非实际的内存中的内容. int *pMyInt;   pmyint 表示存放的地址,是一块内存地址.     int 表示这块地址里面存放的数据类型   *表示指针变量 指针变量= 指针.描述方便.指针变量所存放的地址

指针与内存的分配

1.指针可以这样理解: int  *ptr; -----> 强调*ptr是一个int类型的指针. int*  ptr; ----->强调的是,int*是一种类型-----指向int的指针. 注意:   int* p1,p2;    //该声明创建一个指针p1和一个int变量p2. 2.指针的危险 计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存.为数据提供空间是一个独立的步骤,很重要. long* fellow; *fellow = 123:/*fellow是一个指针,

C语言 内存和地址

内存与地址 在介绍指针之前,先让我来讲一讲计算机内存与地址.计算机内存可以看作是一辆火车,我们知道火车有很多节车厢,每一节车厢都有车厢编号(坐过火车的人都知道),每一节车厢就可比喻为计算机的一块内存,车厢里面有座位号,通过座位号就可以唯一的确定一个座位,座位号就好在这一个内存块的偏移量,通过它可以唯一确定的数据存储的位置. 注意,内存中的每个位置由一个独一无二的地址标识,内存中的每个位置都包含一个值. 现在举例说明内存中数据存储,如下表,表中加粗边框部分表示内存中实际存储的数据,无边框部分表示内