|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
5 V. f, l) R( G- N2 R
7 A9 o4 z: H7 a9 r
书名:《深入理解C指针》) t% B% s4 E5 M6 c% X, q
作者:里斯 (Richard Reese) 0 g8 E: o8 w% ~% ^' A9 \
译者:陈晓亮
4 z* t! X6 `* l/ l1 f* d2 H7 V1 o出版社:人民邮电出版社
0 \) I! G1 q, z" ~' {* N出版年:2014年2月1日(第1版)6 @9 D2 X5 O8 R1 G! Z/ V0 C5 A
定价:45.00元
3 `0 w/ W( z" \6 b }装帧:平装
5 G( b s! K p/ D6 T( @/ e; CISBN:9787115344489
) B. O. F6 a- b! |; l* X. v% s. _$ l, k6 n) ^: k8 B
购买链接:3 e3 e6 M) R' F
9 ]- T7 H3 Q* ]. s) v& X
, X9 Z( |* C/ B" V* L/ ~" k* I亚马逊(kindle)-> 传送门# O! g3 S/ S+ e0 U
, e* N* J/ L* k- @4 M亚马逊 -> 传送门
D8 Z" E9 |* F. h. h# y" n/ B* j
: l9 ^# h! d0 a$ ?4 M8 B3 n$ k当当网 -> 传送门4 s1 E" Y) O6 F% V" r( `3 H
) m! x, g! W3 t2 C+ Q' r京东 -> 传送门0 _1 Y# n3 X: s. x$ E- P
$ k+ [5 d+ D; R5 D' l3 y: N天猫 -> 传送门
9 b3 i4 Q8 x. Y' A C+ h' R. a" `- q; R. `* Y# l9 y8 T
1 |$ ^9 a" T' Q7 M+ T% b; h内容简介:9 q Q' |5 _9 A
9 o5 J8 L4 X' N. X* f 3 t h5 \. F4 u8 Q; c. U3 q
指针是 C 语言的一项核心特性,对于指针的掌握程度是区分 C 语言新手与老手的重要标志。《深入理解C指针》专门研究指针,旨在提供比其他图书更全面和深入的 C 指针和内存管理知识。全书巨细靡遗地为读者展现了 C 语言编程中最重要的话题:C 的动态内存管理、指针和函数、指针和数组、指针和字符串、指针和结构体。作者还专门用一章篇幅讲解了安全问题和指针误用,让读者对指针的认识又深入一层。全书每章都穿插了使用指针的注意事项和潜在陷阱,及时贴心地提示读者在编程中避开此类问题。% T" e9 U# q2 f J/ ]* u+ L, f
《深入理解C指针》适合 C 和 C++ 程序员和开发人员阅读,也可作为计算机专业学生学习 C 语言的参考图书。* o/ s" H/ c- k2 t+ ^8 _; g
% C$ S2 e2 A. J% ^/ p- E
0 ~$ X- X$ z: `
目录:& s7 r, M/ m0 U, H) t( j* R) E
( l5 r/ f; N: }' z
0 `- J7 N. S% }, e/ k
前言
+ t9 h# ]5 M6 G& ^# _# V
! ~: x! J' P0 n, G) {第1章 认识指针
2 w0 c& U* t0 i5 |
( L$ w0 ^; X5 x) B1.1 指针和内存
1 \* R5 M1 a7 n( i( e1.1.1 为什么要精通指针
5 }+ A4 k: J7 A' r* _1.1.2 声明指针
* i: F( E! P6 i% F1.1.3 如何阅读声明 + a) Z6 C7 |' {1 B; O
1.1.4 地址操作符
$ m" }' ?/ i0 R0 m! c1 b! |% Z: x1.1.5 打印指针的值 # h5 [* D* g! y4 ?; }0 Q
1.1.6 用间接引用操作符解引指针
+ p/ ?) V8 x, A$ ?+ G1.1.7 指向函数的指针
3 \. k `1 H- `- q2 y/ j1.1.8 null的概念 + s, ?8 W, |: `
1.2 指针的长度和类型
6 _& F; ^8 d- \* n: }/ U- l5 k1.2.1 内存模型 ) j/ A# B0 c3 G: V6 |
1.2.2 指针相关的预定义类型 ! [0 c$ U* O( J2 ]
1.3 指针操作符 3 f5 U6 J$ K3 K- _7 d6 _- Y) O
1.3.1 指针算术运算 2 V1 U, A8 o C2 G% n
1.3.2 比较指针
- R) ?: w3 i' _4 X1.4 指针的常见用法 2 Q+ d6 I0 \( h5 A2 @3 q* _
1.4.1 多层间接引用
; S8 q1 ]( E( R( L' V4 B- H$ i1.4.2 常量与指针 + s1 [% E4 U& ?6 W1 o
1.5 小结 / V8 n- R n$ [
( a/ N: X1 |1 p6 ]5 D第2章 C的动态内存管理 & g r" g+ i X
# j0 y8 p9 q- ]" D# A; ]7 j" S) `3 J* b
2.1 动态内存分配 + e$ P5 ^# ]0 H) N# p* Y f
2.2 动态内存分配函数
' ]% m8 t. u5 d* b2.2.1 使用malloc函数
2 M p5 }+ ~* m3 J2.2.2 使用calloc函数 7 r; h9 Z# D) t# {$ b- D6 G" r) H1 }
2.2.3 使用realloc函数
/ E% r$ ^2 R# ~+ n2.2.4 alloca函数和变长数组 ; N2 U) R) s. w6 D _! z, q
2.3 用free函数释放内存
- ^# u$ n6 \" k/ _0 @/ U/ w8 f2.3.1 将已释放的指针赋值为NULL ' {- f" k6 \- T$ @7 k) V8 u
2.3.2 重复释放 7 {9 X; y. z) D7 }% e
2.3.3 堆和系统内存
9 [9 X9 `( I! i- v, w. X4 }2.3.4 程序结束前释放内存
" y @1 N+ W: ~2.4 迷途指针 6 ^3 _0 Q! v2 j
2.4.1 迷途指针示例
; X/ f6 s% ~. p* b1 m: b2.4.2 处理迷途指针 8 s- [- f1 F* h& `
2.4.3 调试器对检测内存泄漏的支持 0 [/ S, T; w, v5 `
2.5 动态内存分配技术 - h/ v$ I/ ?0 ]! `5 \" V# O4 D0 j5 a
2.5.1 C的垃圾回收
/ S1 R, h; `* ~+ B) ^- d. G; i2.5.2 资源获取即初始化
8 e) A& U( k7 X- d2 W9 [" ^# x; O. |2.5.3 使用异常处理函数
/ g$ L8 O0 o: J2.6 小结
& B8 J0 R: ]: P; I% E( g
3 d- ~8 a4 K$ L, j& k' g第3章 指针和函数
3 n3 j) f0 l* i7 u4 c) N) ~5 X. ^7 p4 b7 S
3.1 程序的栈和堆
3 C8 Y; l+ o$ L* o# X* H4 X3.1.1 程序栈
3 s, d+ N3 Y- L3.1.2 栈帧的组织
$ X4 @+ B1 L0 C# x8 L3.2 通过指针传递和返回数据
i7 Q, Q3 k; L* h: n3.2.1 用指针传递数据
0 |0 b( }7 U1 A3.2.2 用值传递数据
/ l* ]+ V5 M: S3.2.3 传递指向常量的指针
6 Z" o5 h; F/ Z/ U' I% I9 F: t: s" U3.2.4 返回指针 / u* ] e! X1 z! I* K' q- N
3.2.5 局部数据指针 - V3 R4 U2 Z" C2 C) g
3.2.6 传递空指针 6 C2 m8 a8 S) b4 p
3.2.7 传递指针的指针 9 I, U* w3 e s% ]
3.3 函数指针
A7 R5 K( |2 ?1 W* [, \3.3.1 声明函数指针
, q7 u8 x6 t( d: T/ \' B3.3.2 使用函数指针 $ M) D. g6 E+ V% O/ T
3.3.3 传递函数指针 2 D; w- R" u6 l7 o
3.3.4 返回函数指针 6 B _/ j8 B: G
3.3.5 使用函数指针数组
t+ m6 q& x0 o3.3.6 比较函数指针
' g. `' x2 H# M8 i3.3.7 转换函数指针 6 C N8 M: m# g' T' D
3.4 小结
# r0 r+ W9 D( U7 |+ {- q7 V! j$ m) ]+ g- C7 `7 i
第4章 指针和数组 9 j2 a, G) `2 m" X7 \* C( f: V& Y
% u, @5 c9 m6 G6 J1 O4 O' L
4.1 数组概述 " O3 |% p1 n/ `, W
4.1.1 一维数组
5 q- i7 l% `3 f) H4 B4.1.2 二维数组
, C: i( M2 ?2 @/ \$ O# n- c1 y4.1.3 多维数组 + I1 J; ^* Y L
4.2 指针表示法和数组
2 N1 K+ q! G/ `4.3 用malloc创建一维数组 8 D; k1 g) T7 q* ]4 b# g
4.4 用realloc调整数组长度 9 r) o$ a8 e$ k$ c
4.5 传递一维数组
( e, K- S% H8 S$ v6 y4 h+ Y; U4.5.1 用数组表示法
* b7 u6 d! }0 G2 M% ]4.5.2 用指针表示法
6 F# f; l( m- F) c5 j/ }; P4.6 使用指针的一维数组 7 Z% h) n! G, g+ T+ N+ R
4.7 指针和多维数组 2 p+ k# L7 T; B% {4 P1 D7 `! Z$ T
4.8 传递多维数组 4 s9 w( p2 [" b% W
4.9 动态分配二维数组 ( B; h' z/ K/ F( ]. J! k8 d5 F* q
4.9.1 分配可能不连续的内存 4 G1 x" @4 b( K6 o; ?. p7 Q
4.9.2 分配连续内存 . x1 Q! k6 x4 O2 D4 E1 p
4.1 不规则数组和指针 + b' P5 J, h/ O" o) g
4.11 小结
: k( J0 ]& Q3 B1 c( p: x
. p. w0 R J+ z5 J& b8 E第5章 指针和字符串 7 w3 V7 P4 ~5 W- M/ a$ |4 ^- }* `4 ]
0 b, m' s- S, x& l1 e0 _5.1 字符串基础 " u1 g R& G1 X/ Y+ z: D
5.1.1 字符串声明 / w w! f0 ^% F" T/ _/ N
5.1.2 字符串字面量池 - L8 H, _: m1 E# f- x* W4 d, Z
5.1.3 字符串初始化 9 u) Y2 u: p- ^% X, k
5.2 标准字符串操作 Y5 e7 j. W5 t, P }
5.2.1 比较字符串
) @& K1 Y O0 s! ^( R: S5.2.2 复制字符串
* _! G2 `' }7 n5.2.3 拼接字符串 - D4 }- S( B1 T. h- P* t- E7 [& Q4 v
5.3 传递字符串
' x9 V& b" z+ E$ o* P& s: ^3 W5.3.1 传递简单字符串 , A' \3 {$ @9 \0 v3 y- m
5.3.2 传递字符常量的指针 + W' e0 H9 d/ T9 A! M
5.3.3 传递需要初始化的字符串
% m6 z6 C+ h2 y, u, B7 t# t5.3.4 给应用程序传递参数 ; _ p9 J) C, U! t K: x5 N- d! g$ S+ G
5.4 返回字符串
' L5 G5 S7 s0 p2 I) n1 J5.4.1 返回字面量的地址
# U6 h% w' X: C B; o6 a5.4.2 返回动态分配内存的地址
. U3 X! O9 V* a% W2 f2 |4 i, O' m$ u5.5 函数指针和字符串
5 l* s0 }* x. q0 v3 L* P2 d5.6 小结 . y$ r+ x" g% N8 a7 Y8 d
) t4 |2 V2 E* D% ]第6章 指针和结构体
1 x$ E1 i# e6 {. r% `6 ^4 W, m: m @, R4 c; B) |) y" ?
6.1 介绍
; v! v6 `) h8 g8 o) l" H% T: _6.2 结构体释放问题 ) o( H/ d8 b/ x- e. k0 s) e7 i0 ]
6.3 避免malloc/free开销 3 [. n- b4 c/ B! |- O, V
6.4 用指针支持数据结构 4 |3 }1 T0 Y$ n' r$ Z' P
6.4.1 单链表 $ S' c& u, B! s8 m. T8 w9 Q
6.4.2 用指针支持队列
# ]. V2 v R" ~9 F/ W6.4.3 用指针支持栈 $ }* }% i3 O* }2 U5 h0 W1 S
6.4.4 用指针支持树 3 S2 z0 a. `3 \" ?
6.5 小结 . [6 O' W+ O# S; l4 w8 y* m" L
6 R1 I) E3 Z1 w+ L# M第7章 安全问题和指针误用 # {0 M2 T" O8 f( J( _: o' W* g; T" v
7 i) W' N( [" F6 K
7.1 指针的声明和初始化 5 I8 y, L" ~' x& s
7.1.1 不恰当的指针声明
+ c g5 e+ y$ X( S9 S7.1.2 使用指针前未初始化
" H- ^% `6 r+ z0 h$ F9 r7.1.3 处理未初始化指针
( ?% [6 d C: @, r! F7.2 指针的使用问题 9 [5 j$ x5 [+ l6 H
7.2.1 测试NULL + _' N- {: u! |- [
7.2.2 错误使用解引操作
% X5 v$ l$ o0 }% f7.2.3 迷途指针
2 Y d3 C. E- W3 ?8 M ~. T8 k7.2.4 越过数组边界访问内存
- T5 Y/ _# y1 m: E# q5 J+ F: k, h2 f$ `7.2.5 错误计算数组长度 6 i! X7 x7 ^* }+ C4 a2 v/ I
7.2.6 错误使用sizeof操作符 B. |( l& s) b* B) c& `1 x
7.2.7 一定要匹配指针类型 $ v' F8 H( f& O" ?
7.2.8 有界指针 ' F* i. o: ?9 M2 C2 F. H$ E% D
7.2.9 字符串的安全问题 6 b8 A. y# P! U0 x( n& F9 S" n# Z
7.2.10 指针算术运算和结构体 6 P# R. v2 _( x ~
7.2.11 函数指针的问题 " t8 [$ Z- X2 |7 ` k
7.3 内存释放问题 5 U9 e7 H4 A1 z: E' I3 \6 r
7.3.1 重复释放 4 o0 l' E. ~- x
7.3.2 清除敏感数据 8 B9 n& S4 I1 g, `) h! P j5 S+ V7 Y
7.4 使用静态分析工具 5 q$ h. S4 c4 B% i& ~/ m
7.5 小结
& q$ g: [; J& N$ p5 J, s* f3 k* W% R1 O, S* o* a8 X& o
第8章 其他重要内容 1 ~0 G. A* q, i! T% s1 }# a. P
" F( Z! z/ W0 T; Y0 S0 t8.1 转换指针
5 p- J! f# ~# }' f+ {8.1.1 访问特殊用途的地址
- a1 v2 j7 T0 J) @" j8.1.2 访问端口
; [7 m+ ?( |" X3 a3 b5 ?; r2 y V8.1.3 用DMA访问内存 ' t2 ]7 w: Q9 z: c. g
8.1.4 判断机器的字节序
B- O" O: u' N! s7 A( W8.2 别名、强别名和restrict关键字 * y' c, u# k) s
8.2.1 用联合体以多种方式表示值 $ _( p8 ?- B6 V: b) q/ w4 c6 Z# w$ P
8.2.2 强别名 " w" ~/ \: e( |0 u y- M' k
8.2.3 使用restrict关键字
6 R9 P! [$ h/ s2 |+ J' G: s9 V8.3 线程和指针 5 B b" Q1 O9 D6 K4 w
8.3.1 线程间共享指针
: S1 j" @! V( h, q0 Q8.3.2 用函数指针支持回调
% d; C& q: |1 X' Z5 Z8.4 面向对象技术 & J5 d% d( U8 E' S% D3 ]
8.4.1 创建和使用不透明指针
! O- W& \1 h1 G9 _# t% Q! N: ?8.4.2 C中的多态
! [4 j8 \/ g# c2 o/ ]8 V8.5 小结 ' @- I5 _* b( {8 ?2 T
4 D4 p. }& \% p3 ]$ Q h; h, _关于作者和封面1 U; ~0 ?8 r' U( [0 V& Y7 c
5 g7 C+ T/ d% K2 M. c
; v# A, C6 n& \ |
|