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类型的数据,然后通过 “ * ”像这块内存写入一个数据。
- C语言深度解剖(精讲版)——读书笔记14 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记1 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记2 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记3 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记4 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记5 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记6 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记7 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记8 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记9 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记10 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记11 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记12 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记13 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记15 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记16 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记17 &&自己的一些理解
- C语言深度解剖(精讲版)——读书笔记19 &&自己的一些理解
- 拦截QT关闭窗口的CloseEvent
- 分析称App应用内置广告已成移动广告市场主流
- Linux常用命令大全
- 四则运算表达式求值
- Android——CursorAdapter抽象类(API)
- C语言深度解剖(精讲版)——读书笔记14 &&自己的一些理解
- 使用svnsync备份(远程)svn仓库
- C# 日期格式大全
- 详解公钥、私钥、数字证书的概念
- 黑马程序员—java数组学习回顾
- Android在文本中添加超链接 (TextView)
- outlook各种问题一路下来
- 优秀的程序员
- win7设置JDK环境变量