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

第四章 指针和数组

指针

一.指针的内存布局

先来看下面的例子: 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类型的数据,然后通过 “ * ”像这块内存写入一个数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值