2022年C语言指针 .pdf
《2022年C语言指针 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言指针 .pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言指针一、指针的内存布局先看下面的例子:int *p; 大家都知道这里定义了一个指针p。 但是 p 到底是什么东西呢?还记得第一章里说过,“任何一种数据类型我们都可以把它当一个模子”吗?p,毫无疑问,是某个模子咔出来的。我们也讨论过, 任何模子都必须有其特定的大小,这样才能用来“咔咔咔”。 那咔出 p 的这个模子到底是什么样子呢?它占多大的空间呢?现在用sizeof 测试一下(32 位系统): sizeof (p)的值为 4。嗯,这说明咔出 p 的这个模子大小为 4 个 byte 。显然,这个模子不是“ int ”,虽然它大小也为4。既然不是“int ”那就一定是“ int *”了。好,那
2、现在我们可以这么理解这个定义:一个“int *”类型的模子在内存上咔出了4 个字节的空间, 然后把这个 4 个字节大小的空间命名为p,同时限定这 4 个字节的空间里面只能存储某个内存地址,即使你存入别的任何数据, 都将被当作地址处理, 而且这个内存地址开始的连续 4 个字节上只能存储某个int 类型的数据。这是一段咬文嚼字的说明,我们还是用图来解析一下:如上图所示,我们把 p 称为指针变量 ,p 里存储的内存地址处的内存称为p 所指名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1
3、页,共 5 页 - - - - - - - - - 向的内存。指针变量 p 里存储的任何数据都将被当作地址来处理。我们可以简单的这么理解: 一个基本的数据类型 (包括结构体等自定义类型)加上“*”号就构成了一个指针类型的模子。这个模子的大小是一定的, 与“*”号前面的数据类型无关。“ *”号前面的数据类型只是说明指针所指向的内存里存储的数据类型。所以,在32 位系统下,不管什么样的指针类型,其大小都为4byte 。可以测试一下 sizeof (void * )。二、“*”与防盗门的钥匙这里这个“ *”号怎么理解呢?举个例子:当你回到家门口时,你想进屋第一件事就是拿出钥匙来开锁。那你想想防盗门的
4、锁芯是不是很像这个“*”号?你要进屋必须要用钥匙,那你去读写一块内存是不是也要一把钥匙呢?这个“*”号就是不是就是我们最好的钥匙?使用指针的时候,没有它,你是不可能读写某块内存的。三、int *p = NULL 和*p = NULL 有什么区别?很多初学者都无法分清这两者之间的区别。我们先看下面的代码:int *p = NULL; 这时候我们可以通过编译器查看p 的值为 0 x00000000。这句代码的意思是:定义一个指针变量 p,其指向的内存里面保存的是int 类型的数据;在定义变量p 的同时把 p 的值设置为 0 x00000000,而不是把 *p 的值设置为 0 x00000000。这
5、个过程叫做初始化,是在编译的时候进行的。明白了什么是初始化之后,再看下面的代码:int *p; *p = NULL; 同样,我们可以在编译器上调试这两行代码。第一行代码, 定义了一个指针变量p,其指向的内存里面保存的是int 类型的数据;但是这时候变量 p 本身的值是多少不得而知,也就是说现在变量p 保存的有可能是一个非法的地址。第二行代码,给 *p 赋值为 NULL ,即给 p 指向的内存赋值为NULL ;但是由于 p 指向的内存可能是非法的, 所以调试的时候编译器可能会报告一个内存访问错误。这样的话,我们可以把上面的代码改写改写,使p 指向一块合法的内存:int i = 10; int *
6、p = &i; *p = NULL; 在编译器上调试一下,我们发现p 指向的内存由原来的10 变为 0 了;而 p 本身的值,即内存地址并没有改变。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 经过上面的分析, 相信你已经明白它们之间的区别了。不过这里还有一个问题需要注意,也就是这个NULL 。初学者往往在这里犯错误。注意 NULL 就是 NULL ,它被宏定义为 0:#define NULL 0 很多系统下除了有NULL外,
7、还有 NUL (Visual C+ 6.0 上提示说不认识NUL )。NUL 是 ASCII 码表的第一个字符, 表示的是空字符, 其 ASCII 码值为 0。其值虽然都为 0,但表示的意思完全不一样。同样,NULL 和 0 表示的意思也完全不一样。一定不要混淆。另外还有初学者在使用NULL 的时候误写成 null 或 Null 等。这些都是不正确的,C 语言对大小写十分敏感啊。当然,也确实有系统也定义了null ,其意思也与 NULL 没有区别,但是你千万不用使用null ,这会影响你代码的移植性。四、如何将数值存储到指定的内存地址假设现在需要往内存0 x12ff7c 地址上存入一个整型数0
8、 x100。我们怎么才能做到呢?我们知道可以通过一个指针向其指向的内存地址写入数据,那么这里的内存地址 0 x12ff7c 其本质不就是一个指针嘛。所以我们可以用下面的方法:int *p = (int *)0 x12ff7c; *p = 0 x100; 需要注意的是将地址0 x12ff7c 赋值给指针变量p 的时候必须强制转换。 至于这里为什么选择内存地址0 x12ff7c ,而不选择别的地址, 比如 0 xff00 等。这仅仅是为了方便在 VisualC+ 6.0 上测试而已。 如果你选择 0 xff00 ,也许在执行 *p = 0 x100; 这条语句的时候,编译器会报告一个内存访问的错误
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C语言指针 2022 语言 指针
限制150内