diff --git a/reference.md b/reference.md index d8e377d..015f824 100644 --- a/reference.md +++ b/reference.md @@ -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 \ No newline at end of file diff --git a/res/images/uninitpointer.png b/res/images/uninitpointer.png new file mode 100644 index 0000000..81c3da3 Binary files /dev/null and b/res/images/uninitpointer.png differ