没有合适的资源?快使用搜索试试~ 我知道了~
不晕乎的C/C++指针(技术文档)
5星 · 超过95%的资源 需积分: 0 31 下载量 159 浏览量
2013-07-27
17:09:53
上传
评论
收藏 219KB PDF 举报
温馨提示
试读
12页
山东大学的C_C++指针详解。本文是学习和使用指针时总结出来的一点东西,学习完就会对指针有比较明晰的讲解,更详细的东西需要你自己实践摸索。
资源推荐
资源详情
资源评论
不晕晕不乎乎的 C/C++ 指针
1
Liam Huang
23
1
这只是一篇整理性的文章。
2
山东大学 09 级数学学院信息安全专业本科生。
3
liamhuang0205@gmail.com
本文之缘起从略,无非是刘老师
1
学业不精,学习和使用指针时总结出来的一点东西罢
了。好了,废话不说,直接进入正题。
1 指针的三个要素
所谓变量
C/C++ 里面的变量,实际上是在程序运行过程中内存空间中的一块固定区域。而变量的
名字就是这块区域的“代号”,在编写计算机程序的时候,我们可以通过这个“代号”对这
块固定区域进行一定的操作,比如赋值。
变量在哪里
我们知道,内存是一块很大的记忆体,计算机向其中存取数据是通过一个内存编址来进
行定位的。在一个 C/C++ 程序中,你可以使用取址运算符(第 2章)来得到一个变量的内
存编址。在 32 位计算机中,内存编址通常是 32 位(4Bytes)的,这相当于是一个 int型的
变量的长度。
1 int a = 0;
2 std::cout << &a << std::endl;
什么是指针
C/C++ 里面的指针是一个特殊的变量,具有一般变量的基本特性,也具有它自己的特别
性质。指针存储的数值被理解成是内存里的地址。同时指针和数组还有这千丝万缕的关系,
具有一些神奇的性质。
要想搞清楚一个指针,必须要搞清楚指针三方面的内容,即指针的类型、指针所指向的
类型、指针的值。
2
在声明一个指针的时候,指针变量的名字前面必须要加上一个星号 (*),以表示这是一个
指针。以下声明几个指针,用以之后来判断 ptr 作为指针的各种性质(情况)。
1 int *ptr;
2 char *ptr;
3 float **ptr;
4 double (*ptr)[5];
5 bool *(*ptr)[5];
1.1 指针的类型
所谓指针的类型,就是把指针声明语句中指针名字去掉的部分。之前有声明几个例子,
让刘老师带大家来看看各例中指针的类型。
1 int *ptr; //指针的类型为int *
2 char *ptr; //指针的类型为char *
3 float **ptr; //指针的类型为float **
4 double (*ptr)[5]; //指针的类型为double (*)[5]
5 bool *(*ptr)[5]; //指针的类型为bool *(*)[5]
1
吾有多重人格,比如本色的是阿黄,假正经的时候是 Liam,道貌岸然的则是刘老师。
2
这是刘老师自己总结的,学界不一定有这个说法(指三个要素),但大家可以放心地按照这种方式思考。
1
1.2 指针所指向的类型
我们知道,在 C/C++ 中,对于不同类型的变量系统会分配不同大小的存储空间。当通
过指针来访问指针所指向的内存空间时,声明指针时指针指向的类型决定了编译器将如何对
待那片区域中的数据。因此了解指针所指向的类型是必须的。
另外值得一提的是,指针的类型(这是说指针本身)和指针所指向的变量的类型 (这是说
指针指向的那个变量) 是两个概念,必须加以区分。而混淆这两个概念往往是导致“迷糊”
的根源。
通过指针变量的声明得到指针所指向的类型很简单,从语法上看,只需要去掉指针声明
语句中指针变量的名字还有其前面紧挨着的那个星号即可。例如
1 int *ptr; //指针所指向的类型为int
2 char *ptr; //指针所指向的类型为char
3 float **ptr; //指针所指向的类型为float *
4 double (*ptr)[5]; //指针所指向的类型为double ()[5]
5 bool *(*ptr)[5]; //指针所指向的类型为bool *()[5]
1.3 指针的值——指针指向的内存空间的编号
指针也是一个变量,它的值就是它指向的变量所占据的内存空间的编号。准确的说,是
它指向的变量所占据第一块内存空间的内存编址。之前有介绍,一个 32 位系统中的内存编
址是 32 位的二进制数,所以指针的值也是一个 32 位的二进制数。
值得注意的是,到目前为止,例子中声明的五个指针都是空指针,他们不指向任何内存
空间。这是因为在声明他们的时候,并没有给他们赋值,系统默认为他们赋值了空指针。
2 取址(&)和解引用(*)运算符
& 和 * 这两个运算符的名字已经在标题中给出了——& 是取址运算符,* 是解引用运算
符。
&a 的运算结果是一个指针,指针的类型是变量 a 的类型加上个 *,指针所指向的类型就
是变量 a 的类型,指针所指向的地址就是 a 的地址(也就是 &a)。
*ptr 就是 ptr 所指向的那个变量。换而言之,如果 ptr 是指向变量 a 的指针,那么 *ptr 就
是变量 a 本身。*ptr 的类型就是变量 a 的类型,*ptr 所占据的内存空间就是变量 a 在声明时
系统分配的内存空间。
1 int a = 12;
2 int b = 0;
3 int *p;
4 int *ptr;
5 p = &a; //从这一句开始分析。
6 *p = 24;
7 ptr = &p;
8 *ptr = &b;
9 **ptr = 36;
这是刘老师对上面的例子依次进行的分析:
• &a 的结果是一个指针,类型是 int*,指向的类型是 int,指向的地址是 a 的地址,这
被赋值给了指针 p。
• *p 就是 a,所以此时 a == 24。
2
剩余11页未读,继续阅读
资源评论
- wanghan3122013-07-30讲解的比较详细
lxllb8
- 粉丝: 66
- 资源: 579
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功