一、#include “filename.h”和#include <filename.h>的区别 %n$f#Ml_r
"}()/
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 "](Q2
wR_mJMk_
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 <zXG}JuL@T
/
&Z8g4vc
?NA$<0
二、头文件的作用 P%R!\i
?s, oH
加强安全检测 !Q\*a-C
HzM\<YD
通过头文件可能方便地调用库功能,而不必关心其实现方式 eg;r38
gdIk%m4
/Xi21W/
三、* , &修饰符的位置 0(i3RPIj\
_i>_S n1"
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 1gK|n
)M;~j
b_sasZo
四、if语句 SY
Bp-o
& %/p;::A
不要将布尔变量与任何值进行比较,那会很容易出错的。 K~#?Y,}O
e6p3!)@P1
整形变量必须要有类型相同的值进行比较 M4Cb(QAVP
I'xc$f_+
浮点变量最好少比点,就算要比也要有值进行限制 (?Ko:0+*
Ucv7`W
gr
指针变量要和NULL进行比较,不要和布尔型和整形比较 hTa X@=Ra
YT-ua{.^
i6yA>#^
五、const和#define的比较 g#(+:^3'
'/`O*KD]
const有数据类型,#define没有数据类型 #~p;s>
cn}15JHdR
个别编译器中const可以进行调试,#define不可以进行调试 XoD:gf
^?{&v19m
在类中定义常量有两种方式 2#NnA3l]x%
ObM/~{rKx
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; Xc[ym
6"iNh)
2、 用枚举代替const常量。 #pZeGI|'J
_1)n_P4
=x+1A)Q
六、C++函数中值的传递方式 YC;@ ^
d>u^7:
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) &&CrF~
_wXT9`|3
void fun(char c) //pass by value ,q%X`F
rc
0WzoI2Q
void fun(char *str) //pass by pointer A< .5=E,/
L:C/PnIV
void fun(char &str) //pass by reference d"5_x]Z;
MR|A_e^x
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 t,LK92?
&n,v@
gt
函数的类型不能省略,就算没有也要加个void XR",.3LD
Pfs_tu
yW?-Z[
七、函数体中的指针或引用常量不能被返回 M gP|'H3\
P,ZQ*Ju
Char *func(void) oaha5aWH
d7BpmM
{ O-[YU%K3?
Ak3^en
char str[]=”Hello Word”; F4~OsgZ'N
Lea4-Gc
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 UG44 oKB
t>quY$}4
return str; .oM- A\!
'{0O!y[H6
} P'iX?+*
1<~n2}
函数体内的指针变量并不会随着函数的消亡而自动释放 <mP_K^9c
0Gj/yra9MO
j&dCP@G
八、一个内存拷贝函数的实现体 ()j)}F#Z`
1/1oT
void *memcpy(void *pvTo,const void *pvFrom,size_t size) \4qF3#
K"[jrvZ=
{ =W2.Nc
)0I-N)
assert((pvTo!=NULL)&&(pvFrom!=NULL)); +|;Ri68
=P,mix|
byte *pbTo=(byte*)pvTo; //防止地址被改变 q2|x$5
c61 1&
byte *pbFrom=(byte*)pvFrom; xuHP4$<h3
=mQY%l
while (size-- >0) b&A/S$*
wx-&(f
pbTo++ = pbForm++; }+lK'6
\_u{ EB'b
return pvTo; hQ>$"0K
{{gd}g
} k6DJ(.n'%a
E9k%:&]vd
+z9BWo!{I
九、内存的分配方式 |Zn;O6c#L5
"1""1";
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 e+#Oj
jCj8XM{c>
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 /(||9\;
^xk4HF
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 D]d! lMK/
sAO/yG
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 )(YJ6l
,h%n5R$:
[
s/j?/9
十、内存分配的注意事项 &
:W6O)uY
`r&Ui%fk;0
用new或malloc分配内存时,必须要对此指针赋初值。 ~eTp( XG
)w}'kih
用delete 或free释放内存后,必须要将指针指向NULL S&=@Hj-
qDg`4yX.}
不能修改指向常量的指针数据 T+0z.E!~I
y+wy<[u
i`6utOq
十一、内容复制与比较 S\ZCZ0
P5dD&
//数组…… ve a$G~[%6
XmO]^ `
char a[]=”Hello Word!”; ,F!-17_vt
~K)FuL[*
char b[10]; s%#u)nw19
X,M!Tp
strcpy(b,a); ~D/Lo$K"
IY~I=}
if (strcmp(a,b)==0) }|-8-;
B~Z61
{} 3>5gh8!-
q 7W7sw
//指针…… V[^AV"V
`nII@ !
char a[]=”Hello Word!”; K\RMX?YsP
\\Zsxya1
char *p; 7!o#pt7
ho#<?rh_
p=new char[strlen(a)+1]; }>f%8O}
(.z0.0W
strcpy(p,a); 3?gfDJfE
|J-tU)|1vl
if (strcmp(p,a)==0) B}y#AVSA
_MQh<,Z8
{} 9l[C&0w#\
@d5t%V\
BVv-1$ U^
十二、sizeof的问题 b!QRD'31'j
7
mA3&<&q
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 ~s?y[yy6i
Z@JTZMN_
char a[]=”Hello World!” %"E!E1_Sv
KKg\n^
char *p=a; .ezko\nU
b
V_<5PHP
count<<sizeof(a)<<end; //12字节 rCGKE`H
9$(N q
count<<sizeof(p)<<endl; //4字节 otdv;xI9
0ly6 |:
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 gpbdK?
Vw.4;Zy(
void fun(char a[1000]) FAGi`X<L
n68qxD-X
{ O#^qd0e'P!
8SiWAOQAL
count<<sizeof(a)<<endl; //输出4而不是1000 5M>SrZH
oY\;KPz
} 't\sXN+1
pP\^bjI
:-2sKD y
十三、关于指针 uW(Ngcpr
C3<_0eI
1、 指针创建时必须被初始化 w(Mi?
Nhjz~S<o
2、 指针在free 或delete后必须置为NULL VzM (u_)
4&L,QSJ V
3、 指针的长度都为4字节 *rm[\
]3U|K .G
4、释放内存时,如果是数组指针,必须要释放掉所有的内存,如 /HSg)
DfOigLG*
char *p=new char[100]; xy)W_~Mk
:W'.SRD
strcpy(p,”Hello World”); '7]9q#{su
5 "x1Pln
delete []p; //注意前面的[]号 obX2/
ZE/Aj/7Qy
p=NULL; g1UQ6Oa
? a?]
LIE8
5、数组指针的内容不能超过数组指针的最大容易。 0KZsWlD:L
hg^klQD
如: NUi&x