C语言深度解剖(精讲版)——读书笔记14 &&自己的一些理解

来源:互联网 发布:彩虹六号围攻n卡优化 编辑:程序博客网 时间:2024/04/26 01:03

第四章   指针和数组

指针

一.指针的内存布局

先来看下面的例子:  int  *p;

sizeof(p)=4 ;  这说明“咔”出的p的模子为4字节,显然这个模子不是“int”,虽然它的大小为4.既然不是int,那就一定是“int *”;下面我们来讨论“int *”;

         一个“int *”类型的模子在内存上占4个字节的空间,然后把这个4字节大小的空间命名为p,同时限定这4个字节的空间里只能存储某个内存地址(即使你存入任何数据,都将被当做地址处理),而这个地址开始的连续4字节上只能存储某个int类型的数据。

        我们来看下面的图片解释来方便理解上面这段文字吧:      

指针示意图:指针p指向地址为0x0000ff00的内存

 

如图:我们把

p:称为指针变量,p里存储的内存地址处的内存称为p所指向的内存。(指针变量p里存储的任何数据都将被当做地址来处理)

简单理解:

一个基本的数据类型加上“ * ”号就构成了一个指针类型的模子。这个模子的大小是一定的,与“ * ”前面的数据类型无关;“ * ”号前面的数据类型只说明指针所指向的内存数据的类型;

所以32位系统下,不管什么样的指针类型,其大小都为4个字节。可用sizeof(void *)来进行验证。

 

二." * "与防盗门的钥匙

“ * ”怎么理解呢? 举个例子:当你回到家门口时,你想进屋的第一件事是拿出钥匙来开锁,试想防盗门的锁芯是不是很像这个“ * ”号?

你要进屋要用钥匙,那你去读/写一块内存是不是也要一把钥匙?这个“ * ”号就是我们最好的钥匙。 使用指针的时候,没有它,就不可能读/写某块内存。

 

三.  int *p =NULL  和 *p =NULL  有什么区别

先看下面的代码:

int  *p=NULL;

这时候我们通过编译器查看p的值为0x00000000.

这句代码的意思:定义一个指针变量p,其指向内存里面保存的是int类型的数据; 在定义的同时把p的值设置为0x00000000 ,而不是 *p的值设置为0x00000000.

在看下面的代码:

int  *p;

*p =NULL;

我们可以在编译器上调试这两行代码。

第一行代码,定义了一个指针变量p,其指向的内存里面保存的是int 类型的数据;(但这时变量p本身的值是多少不得而知,这时变量p保存的有可能是一个非法的地址,由于p指向的内存可能是非法的,所以调试的时候编译器可能会报告一个内存访问错误。我们可以把上面的代码进行改写,使p指向一块合法的内存)

int  i=10;

int  *p= &i;

*p =NULL;

在编译器上调试一下会发现p指向的内存由原来的10变成了0;而p本身的值,即内存地址并没有改变;

[ 注意:NULL就是NULL,它被定义为0 ]

 

四.如何将数值存储到指定的内存地址

假设需要往内存地址0x12ff7c上存入一个整型数0x100,那么怎么才能做到呢?  可以通过指针指向的内存地址写入数据,那么这个内存地址ox12ff7c其本质不就是一个指针嘛,所以我们用下面的方法:

int  *p = (int *) 0x12ff7c;

     *p = 0x100;

需要注意:将地址0x12ff7c赋值给指针变量p的时候,必须强制转换;

另外一种方法:*(int *)ox12ff7c = 0x100;

即:先将地址0x12ff7c强制转换,告诉编译器这个地址将存储一个int类型的数据,然后通过 “ * ”像这块内存写入一个数据。

 

 

 

 

原创粉丝点击