Skip to content

Commit a2da515

Browse files
author
CHE.He.Junqiu
committed
reference first commit
1 parent 9fb036a commit a2da515

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

reference.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,78 @@
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+
![小心!未初始化指针](./res/images/uninitpointer.png)
49+
50+
## 指针的值
51+
## 指针的大小
52+
## *和&
53+
## 多级指针
54+
### **指针
55+
### *指针
56+
## 指针与数组
57+
## 值传递
58+
## 指针传递
59+
## 指针和结构体
60+
## 指针和函数
61+
### 带有指针参数的函数
62+
#### 函数声明
63+
#### 传值
64+
### 函数指针
65+
### 指针函数
66+
## 指针类型转换
67+
## 指针安全
168
# 引用
69+
## 什么是引用
70+
## 引用初始化
71+
## 带有引用的参数的函数
72+
### 函数声明
73+
### 传值
74+
## 指针与引用
75+
## 引用安全
76+
## 引用·汇编级讲解
77+
## 指针和引用的使用场景
78+
# Homework

res/images/uninitpointer.png

2.67 KB
Loading

0 commit comments

Comments
 (0)