Skip to content

Commit f0d4114

Browse files
committed
Updated to Chapter 5, Section 4
1 parent 0c92308 commit f0d4114

26 files changed

+1098
-90
lines changed

Structure.md

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -344,31 +344,9 @@
344344

345345
在这里可以讲讲范围`for`循环了。
346346

347-
### 数组和指针的关系
347+
#### 数组的类型
348348

349-
#### 数组名与指针常量
350-
351-
数组名可以隐式类型转换为指针常量。只有对于`sizeof`这类运算而言,数组名与指针的区别才能看得出来。
352-
353-
在接收参数时,即便按数组形式定义,也会当作指针处理。
354-
355-
这里介绍下`typeid`的使用。
356-
357-
#### 内容访问方式
358-
359-
可以用`*(arr+i)`的形式来访问数组对象。
360-
361-
#### 指针数组
362-
363-
相当于批量定义指针。
364-
365-
如何理解语法(尤其是和数组指针共同出现时,极易混淆)?
366-
367-
#### 数组指针
368-
369-
指针可以指向普通数据,当然也能指向数组!
370-
371-
如何理解语法?
349+
`typeid``is_same`来看看数组的类型都是什么样的,它和指针又是什么关系。
372350

373351
### 字符串(string)
374352

@@ -392,6 +370,20 @@
392370

393371
另外值得强调的是输入流的问题,键盘行为和输入的字符有什么关系,`cin`如何解析这些字符。
394372

373+
### 指针数组和数组指针
374+
375+
#### 指针数组
376+
377+
相当于批量定义指针。
378+
379+
如何理解语法(尤其是和数组指针共同出现时,极易混淆)?
380+
381+
#### 数组指针
382+
383+
指针可以指向普通数据,当然也能指向数组!
384+
385+
如何理解语法?
386+
395387
### 高维数组和高阶指针
396388

397389
#### 二维数组
@@ -406,10 +398,6 @@
406398

407399
指针能指向数组,当然也能指向指针!
408400

409-
#### 高阶指针、数组的复合类型
410-
411-
(随便水水)
412-
413401
### 动态内存分配
414402

415403
我们可以把数组当做指针来用,当然也可以把指针当作数组来用!

generalized_parts/03_control_flow/01_introduction_to_structure_process_and_order.tex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ \subsection*{编译器如何处理代码?}
1414
d=d*d; //为d赋值
1515
cout<<d; //输出d的值
1616
\end{lstlisting}\par
17-
读者可能好奇,代码1.2中的操作有哪些是编译时行为,哪些是运行时行为呢?事实上,只有 \lstinline@include@ 和 \lstinline@using@ 语句是编译时行为;而 \lstinline@double@ 变量的定义、表达式的计算和输出,全部是运行时行为\par
17+
读者可能好奇,代码1.2中的操作有哪些是编译时行为,哪些是运行时行为呢?事实上,只有 \lstinline@include@ 和 \lstinline@using@ 语句是编译时行为;而 \lstinline@double@ 变量的定义、表达式的计算和输出,全部是运行时行为\par
1818
编译器没有人那么智能。它判断这个表达式能否在编译时操作的依据是``它是否在编译时就能确定下来''。由变量构成的表达式当然不满足这样的条件(因为变量可以在任何时候发生改变),于是编译器一刀切,认为只要有变量参与,这个表达式就不能在编译期求得。\par
19-
那么常量呢?看起来好像可以,但它也是不行的!我们在2.1节中介绍过,常量是可以用变量来初始化的。
19+
那么常量呢?看似可以,但它也不总是可行的!我们在2.1节中介绍过,常量是可以用变量来初始化的。
2020
\begin{lstlisting}
2121
int g; //定义一个临时变量g
2222
cin >> g; //通过输入来改变g的值
2323
const int Grid = {g}; //用g的值来为常量Grid初始化
2424
\end{lstlisting}
25-
也就是说,常量的值也未必能在编译期确定下来,所以编译器继续一刀切,认为只要有常量和变量参与,这个表达式就不能在编译期求得\par
26-
看起来只有字面量可以在编译期求得了。比如说
25+
也就是说,常量的值也未必能在编译期就确定下来。一般来说,编译器会对实际情况进行判断,如果一个常量能在编译期求出,这就是编译时行为;否则就放在运行期求出,这是运行时行为\par
26+
另外就是,字面量构成的表达式也可以在编译期求得。比如说
2727
\begin{lstlisting}
2828
int a {15+8/2-3}; //定义变量a并初始化为14
2929
\end{lstlisting}
@@ -33,7 +33,7 @@ \subsection*{编译器如何处理代码?}
3333
constexpr double Pi {3.14159}; //定义常量表达式Pi,现在Pi是一个字面量啦
3434
constexpr double Pi2 {Pi * Pi}; //定义常量表达式Pi2,现在Pi2也是一个字面量
3535
\end{lstlisting}
36-
仅由字面量(广义地说,常量表达式)构成的表达式可以在编译期求出,比如这里的 \lstinline@Pi*Pi@。但假如中间环节出现了变量或常量,那么就会出现问题。
36+
仅由字面量(广义地说,常量表达式)构成的表达式可以在编译期求出,比如这里的 \lstinline@Pi*Pi@。但假如中间环节出现了变量,或者是不能在编译时确定下来的常量,那么就会出现问题。
3737
\begin{lstlisting}
3838
const double Pi {3.14159}; //定义常量Pi,它不是常量表达式,不能视为字面量
3939
constexpr double Pi2 {Pi * Pi}; //试图用Pi来定义常量表达式Pi2

generalized_parts/05_composite_types_and_their_use/03_passing_arguments_by_lvalue_reference.tex renamed to generalized_parts/05_composite_types_and_their_use/03_lvalue_reference_and_passing_arguments.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ \subsection*{引用的类型与 \lstinline@is_same@}
138138
\end{lstlisting}
139139
再看地址,\lstinline@num@ 和 \lstinline@ref@ 的地址也永远相同,它们的内存大小可以用 \lstinline@sizeof@ 求得,这也是相同的。\par
140140
看了这么多,我们发现,引用好像是一个分身,或者是真假美猴王那样的关系,我们根本分辨不清谁是本体,谁是别名。\par
141-
那么,变量与引用的类型一样吗?其实是不一样的。\lstinline@num@ 是 \lstinline@int@ 类型无疑,而 \lstinline@ref@ 和 \lstinline@rref@ 都是 \lstinline@int&@ 类型的。这几个名字看似一模一样,但正主还是原变量,六耳也终究不是孙悟空。\par
141+
那么,变量与引用的类型一样吗?其实是不一样的。\lstinline@num@ 是 \lstinline@int@ 类型无疑,而 \lstinline@ref@ 和 \lstinline@rref@ 都是 \lstinline@int&@ 类型的。这几个名字看似一模一样,但正主还是原变量,六耳也终究不是孙悟空。\footnote{其实从汇编代码中看,C++中的引用全都是通过指针实现的。所以说,在定义引用的过程中,程序上会创建一个我们看不见的指针,包括传引用参数等操作,本质上都是传指针。关于这里的细节,我就不多谈了。}\par
142142
那么如何检验类型呢?我们可以用 \lstinline@type_traits@ 库的 \lstinline@is_same@ 来检验之。它是一个类模版,可以接收两个模版参数,并检验它们是否是同一类型。如果相同话,其静态成员 \lstinline@value@ 的值就是 \lstinline@true@;如果不同的话,其静态成员 \lstinline@value@ 的值就是 \lstinline@false@。\footnote{这里出现了很多新概念,比如类模版,模版参数、静态成员等。读者无须知道细节,我们会在后面慢慢道来。}
143143
\begin{lstlisting}
144144
//需要包含头文件type_traits

0 commit comments

Comments
 (0)