|
| 1 | +# 指针 |
| 2 | +虽然这一章的题目是“引用”,但我决定先讲讲指针。 |
| 3 | +## 什么是指针 |
| 4 | +在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 |
| 5 | +—— via 百度百科 |
| 6 | + |
| 7 | +通俗的讲,指针的这个动作像一封邮件,指针就是邮件本身,邮件中所填的地址如同指针所存的地址数值, |
| 8 | +邮递员根据邮件的地址找到收件人,程序根据指针所存的地址数值找到对应的内存地址。(如果你想 |
| 9 | +深入了解这些信息,可以翻翻《计算机组成原理》和《操作系统》) |
| 10 | + |
| 11 | +指针在C/C++中都会经常用到,是高级编程语言中为数不多的支持汇编级编码的语法。 |
| 12 | +## 内存分配 |
| 13 | +我们在编写程序的时候,肯定会遇到内存分配问题,这是几十年来C/C++程序员必定会头疼的问题。 |
| 14 | +这一节就来说说内存分配,这有助于深入我们理解指针。 |
| 15 | + |
| 16 | +程序的内存空间主要有**栈空间**和**堆空间**,栈是程序在编译时就写好的由系统维护,内存由操作系统管理。 |
| 17 | +堆是程序在运行期间动态分配,需要程序员在编码阶段手动管理,决定什么时候向系统申请空间, |
| 18 | +什么时候释放内存空间。 |
| 19 | + |
| 20 | +请看这一段代码: |
| 21 | + |
| 22 | +```C++ |
| 23 | +int num; |
| 24 | +double which = 0.0; |
| 25 | +int *poniter = new int(0); |
| 26 | +``` |
| 27 | +上面的`num`、`which`、`pointer`所在空间存在于栈上,为什么呢?因为你的代码已经表明了我要用 |
| 28 | +这三个变量,系统就会在栈上开辟一定等值大小的空间供你使用。也许你会问了,这儿有一个指针 |
| 29 | +指针难道不是堆上面的吗?嗯,我承认你问的很好,但是`int *pointer`pointer却是在栈上,只不过它存 |
| 30 | +的值是一个地址数值,这个数值指向堆空间,所以`new int(0)`申请到的内存才是堆空间的。 |
| 31 | + |
| 32 | +## 指针初始化 |
| 33 | +在内存分配一节呢,我们已经似乎提到了指针初始化了,你是否能看出呢?我们还是以代码入手吧。 |
| 34 | +```C++ |
| 35 | +int *p = 0;// 0 |
| 36 | +int *numPtr = new int(445);// 1 |
| 37 | +float *wavePtr = new float(259.780f);// 2 |
| 38 | +double *what;// 3 |
| 39 | +``` |
| 40 | +聪明的你一定发现了一个指针的必备要素,是的定义一个指针它必须要有一个`*`。对于指针初始化 |
| 41 | +可以给它赋值一块已存在可用的正确的内存地址如代码注释`1`和`2`,也可以像`0`一样给一个地址 |
| 42 | +0值,也可以,但是程序不保证地址0上有什么东西出现,也不保证你对指针`p`的操作是正确的—— |
| 43 | +很显然,对一个地址0的操作是不合法的——想当然的东西八成是错误的! |
| 44 | + |
| 45 | +或许,你够淘气或者够创新,写出了注释`3`的代码,但是很抱歉,虽然你很有创新意识,但这样的 |
| 46 | +做法我们不赞许,谁也不能保证`what`里面是什么东西——即如果你不再次给`what`指定值,谁也不知道 |
| 47 | +`what`存了什么样的值——这得看编译器心情了。在VS2015下是这样的。 |
| 48 | + |
| 49 | + |
| 50 | +## 指针的值 |
| 51 | +## 指针的大小 |
| 52 | +## *和& |
| 53 | +## 多级指针 |
| 54 | +### **指针 |
| 55 | +### 多*指针 |
| 56 | +## 指针与数组 |
| 57 | +## 值传递 |
| 58 | +## 指针传递 |
| 59 | +## 指针和结构体 |
| 60 | +## 指针和函数 |
| 61 | +### 带有指针参数的函数 |
| 62 | +#### 函数声明 |
| 63 | +#### 传值 |
| 64 | +### 函数指针 |
| 65 | +### 指针函数 |
| 66 | +## 指针类型转换 |
| 67 | +## 指针安全 |
1 | 68 | # 引用 |
| 69 | +## 什么是引用 |
| 70 | +## 引用初始化 |
| 71 | +## 带有引用的参数的函数 |
| 72 | +### 函数声明 |
| 73 | +### 传值 |
| 74 | +## 指针与引用 |
| 75 | +## 引用安全 |
| 76 | +## 引用·汇编级讲解 |
| 77 | +## 指针和引用的使用场景 |
| 78 | +# Homework |
0 commit comments