Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions reference.md
Original file line number Diff line number Diff line change
@@ -1 +1,78 @@
# 指针
虽然这一章的题目是“引用”,但我决定先讲讲指针。
## 什么是指针
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
—— via 百度百科

通俗的讲,指针的这个动作像一封邮件,指针就是邮件本身,邮件中所填的地址如同指针所存的地址数值,
邮递员根据邮件的地址找到收件人,程序根据指针所存的地址数值找到对应的内存地址。(如果你想
深入了解这些信息,可以翻翻《计算机组成原理》和《操作系统》)

指针在C/C++中都会经常用到,是高级编程语言中为数不多的支持汇编级编码的语法。
## 内存分配
我们在编写程序的时候,肯定会遇到内存分配问题,这是几十年来C/C++程序员必定会头疼的问题。
这一节就来说说内存分配,这有助于深入我们理解指针。

程序的内存空间主要有**栈空间**和**堆空间**,栈是程序在编译时就写好的由系统维护,内存由操作系统管理。
堆是程序在运行期间动态分配,需要程序员在编码阶段手动管理,决定什么时候向系统申请空间,
什么时候释放内存空间。

请看这一段代码:

```C++
int num;
double which = 0.0;
int *poniter = new int(0);
```
上面的`num`、`which`、`pointer`所在空间存在于栈上,为什么呢?因为你的代码已经表明了我要用
这三个变量,系统就会在栈上开辟一定等值大小的空间供你使用。也许你会问了,这儿有一个指针
指针难道不是堆上面的吗?嗯,我承认你问的很好,但是`int *pointer`pointer却是在栈上,只不过它存
的值是一个地址数值,这个数值指向堆空间,所以`new int(0)`申请到的内存才是堆空间的。

## 指针初始化
在内存分配一节呢,我们已经似乎提到了指针初始化了,你是否能看出呢?我们还是以代码入手吧。
```C++
int *p = 0;// 0
int *numPtr = new int(445);// 1
float *wavePtr = new float(259.780f);// 2
double *what;// 3
```
聪明的你一定发现了一个指针的必备要素,是的定义一个指针它必须要有一个`*`。对于指针初始化
可以给它赋值一块已存在可用的正确的内存地址如代码注释`1`和`2`,也可以像`0`一样给一个地址
0值,也可以,但是程序不保证地址0上有什么东西出现,也不保证你对指针`p`的操作是正确的——
很显然,对一个地址0的操作是不合法的——想当然的东西八成是错误的!

或许,你够淘气或者够创新,写出了注释`3`的代码,但是很抱歉,虽然你很有创新意识,但这样的
做法我们不赞许,谁也不能保证`what`里面是什么东西——即如果你不再次给`what`指定值,谁也不知道
`what`存了什么样的值——这得看编译器心情了。在VS2015下是这样的。
![小心!未初始化指针](./res/images/uninitpointer.png)

## 指针的值
## 指针的大小
## *和&
## 多级指针
### **指针
### 多*指针
## 指针与数组
## 值传递
## 指针传递
## 指针和结构体
## 指针和函数
### 带有指针参数的函数
#### 函数声明
#### 传值
### 函数指针
### 指针函数
## 指针类型转换
## 指针安全
# 引用
## 什么是引用
## 引用初始化
## 带有引用的参数的函数
### 函数声明
### 传值
## 指针与引用
## 引用安全
## 引用·汇编级讲解
## 指针和引用的使用场景
# Homework
Binary file added res/images/uninitpointer.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.