一、#include “filename.h”和#include <filename.h>的区别 IDv|i.q3
)SFyQ
#include “filename.h”是指编译器将从当前工作目录上开始查找此文件 E?P:!V=_
Q|J$R
#include <filename.h>是指编译器将从标准库目录中开始查找此文件 I!-5
#bxD
*+'l|VaVq\
e$@a zi1
二、头文件的作用 *6%r2l'kZ
)OcG$H NK
加强安全检测 <swYo<?J#
rN^P//
通过头文件可能方便地调用库功能,而不必关心其实现方式 HGRH9W
}7jg>3ng(
s\dF7/b
三、* , &修饰符的位置 q+-Bl
!>5!Fb=Sy
对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名 ^iq$zHbc0u
:.M"M$MRp8
{$mj9?n=v
四、if语句 ~'l.g^p bv
F[SYs/M
不要将布尔变量与任何值进行比较,那会很容易出错的。 !EQMTF=(
oUwu:&<Orm
整形变量必须要有类型相同的值进行比较 Lcyj,R
_mw(~r8R
浮点变量最好少比点,就算要比也要有值进行限制 7EAkY`Op
m^)h/s0A
指针变量要和NULL进行比较,不要和布尔型和整形比较 /P/S0
0vRug|}k#%
x
p#+{}
五、const和#define的比较 wN
![SM/+
+wwK#ocw
const有数据类型,#define没有数据类型 Wg+fT{[f|
fX HNm$"n
个别编译器中const可以进行调试,#define不可以进行调试 jreY'y:
L>mv\D;o.
在类中定义常量有两种方式 U\ A*${
3[L)q2;}$N
1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; GUyc1{6
)'RLK4l
2、 用枚举代替const常量。 v&EHp{8Qd
kOGpe'bV
ZdD]l*.\i
六、C++函数中值的传递方式 {AY`\G
+FoR;v)z=F
有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) F_$ K+6
;?9u#FRtw
void fun(char c) //pass by value >_y>["u6J#
~ 0x9`~
void fun(char *str) //pass by pointer dB`YvKr#
j/R
void fun(char &str) //pass by reference ~pqp`
RJ%~=D
如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 IdlW[h3`[
^L;`F
函数的类型不能省略,就算没有也要加个void #isBE}sT{
he/UvMu
TCSm#?[B
七、函数体中的指针或引用常量不能被返回 `bGAc&,&
) tGC&l+?/
Char *func(void) otXB:a
7K`A2
{ ipEsR/O
R4"g?
e
char str[]=”Hello Word”; hIw<gb4J%
eA>O<Z1>
//这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 ?<Dinq
/0 ,#c2aq
return str; IN!m
Y>+\:O
} Got5(^'c
tWi@_Rlx;
函数体内的指针变量并不会随着函数的消亡而自动释放 EeKEw
Sg
& h9ji[
iuq-M?1
八、一个内存拷贝函数的实现体 LD WFc_
9[|Ql
void *memcpy(void *pvTo,const void *pvFrom,size_t size) 7 [55
u|\Lb2Kb:
{ ]OHzE]Q
D:llGdU#2
assert((pvTo!=NULL)&&(pvFrom!=NULL)); vcAs!ls+
`,&h!h((
byte *pbTo=(byte*)pvTo; //防止地址被改变 Nl7"|()e
i7})VDsZ
byte *pbFrom=(byte*)pvFrom; z@$7T:H>
jj#K[@u
while (size-- >0) dKw*L|5
o\8yYX
pbTo++ = pbForm++; :t]YPt
x9
<cT'
return pvTo; U\y];\~H
5A/G?
} J(S.iTD
9xC,i
)
V$-IRdb
九、内存的分配方式 (eN\s98)/
:M1S*"&:
分配方式有三种,请记住,说不定那天去面试的时候就会有人问你这问题 5>q|c`&}E
R1X9
1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。 _I~W!8&w>
\A _g
2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。 @Wy>4B^
W=o90TwbN
3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。 Xf9<kbRw/
zO2Z\E'%.
&?/h#oF@\
十、内存分配的注意事项 N9Yc\?_NU_
p}!rPd*
用new或malloc分配内存时,必须要对此指针赋初值。 9~<HTH
O(h4;'/E
用delete 或free释放内存后,必须要将指针指向NULL DTt/nmKAqJ
*\I?gDON
不能修改指向常量的指针数据 t*82^KDU
^x4I
d5%A64?
十一、内容复制与比较 ?Il$f_"B:
Ej
ip%m
//数组…… }f<.07
"Nn/vid;
char a[]=”Hello Word!”; ?z171X0
\q(RqD
char b[10]; 'AE)&56
uY,&lX+!
strcpy(b,a); UC;_}>
7Nw7a;h
if (strcmp(a,b)==0) ,;'9PsIS^
@/ wJW``;
{} ?3Se=7
k
eRD?O
//指针…… nfq
D!ToCVos
char a[]=”Hello Word!”; "?EA G
dOqn0Z
char *p; xpKD 'O=T
Lf&p2p?~c
p=new char[strlen(a)+1]; PtCwr)B,
Q_euNoA0
strcpy(p,a); jmmm0,#D
l!<Nw8+U
if (strcmp(p,a)==0) @3K)VjY7
=4"D8UaHr
{} 8=FP92X
@>_`g=
#{1w#Iz;
十二、sizeof的问题 j08}5Eo
D:e9609
记住一点,C++无法知道指针所指对象的大小,指针的大小永远为4字节 <YP>c
ji="vs=y
char a[]=”Hello World!” FRQ0tIp
lV:R8^d
char *p=a; lplEQ]J|
V{p*N*
count<<sizeof(a)<<end; //12字节 mEmznA
OWxYV$
count<<sizeof(p)<<endl; //4字节 XL>cTM
%kS +n_*
而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 x1W<r)A )r
}+h/2D
void fun(char a[1000]) d_BECx<\
k]!Fh^O~,
{ sWP5=t(i+9
6e(|t2^
count<<sizeof(a)<<endl; //输出4而不是1000 fHCLsI
dq28Y$9~
} XMd-r8yYr
NDEltG(
^6bU4bA
十三、关于指针 I$9^i#O'3
"jH=O(37
1、 指针创建时必须被初始化 tI0d!8K
L!Iu\_{q
2、 指针在free 或delete后必须置为NULL s]Nh9h
laG@SV
3、 指针的长度都为4字节 {O9CYP:
dR<