C++ (P103—P154)
1 任一指针变量本身的数据值得类型都是unsigned long int
2 指针值为0的叫做空指针,为了安全起见,声明指针时最好初始化,哪怕是初始化为空指针
3 一般不能使用不同类型变量的地址来给指针赋值,如果确实需要可以进行强制类型转换
int i; double *p = (dobule *)&i;
4 利用指针访问变量的过程称为“间接寻址”
5 指针加n的实际操作是使指针中的地址值加上 sizeof(数据类型)*n
6 如果两个指针所指向的变量类型相同,则它们之间做减法代表的绝对值代表这两个指针之间相隔的数据个数
7 在c++中this是一个指针,区分java哟,记住这句话:实际上,在调用一个对象的成员函数时,系统会首先将这个对象的地址赋给被调用成员函数中的this指针,然后成员函数访问数据成员时,就隐含的使用this指针来确保访问到的数据成员属于这个对象。
静态成员函数就没有this指针,这就是为什么静态函数不能访问非静态的函数,静态成员函数不能声明为常成员函数
8 指向数据成员的指针:数据类型 类名::*数据成员指针名;数据成员指针名=&类名::数据成员名;
使用的时候需要对象调用:对象名.*数据成员指针名;
指向类成员函数的指针:数据类型 (类名::*指针名) (参数列表);指针名=类名::成员函数名;
同样使用的时候需要对象调用:(对象名。*指针名)()
普通函数指针:int (*p)(int ,int );p=函数名;p(1,2);p代表的就是函数名那个函数
返回指针的函数:int *p(int ,int ); int *i=p(1,2);
指向静态成员的指针:使用普通指针即可,成员用类名限制。
int (*p)(int ,int );p=类名::函数名;p(1,2);p代表的就是函数名那个函数
int *p; p=类名::静态数据成员;
9 void指针,一般来说不同类型指针间的赋值时错误的但是void指针是个特例,void类型可以指向任一类型数据,当需要将void类型指针赋给其他类型时需要强转。
用于编写通用型函数,但是void类型指针在运算和输出时都需要强转为具体的数据类型
10 const放在指针类型前,表示声明了一个指向常量的指针。放在*和指针名之间就是声明一个指针常量,这时指针本身的值是不能改变的。
声明对象为常对象的时候,实际上间接声明了这个对象的this指针时常指针。
11 应用程序数据所占的内存有三种静态存储空间、栈、堆。全局变量和静态变量在静态存储空间中,局部变量在栈中,堆成为自由空间,动态内存申请都是像堆中申请空间。
12 dobule atof(const char* buf) 将字符串转换为浮点型数据
double atoi(const char* buf) 将字符串转换为整数型
int sprintf(char *buffer ,format,任意数据)将任意数据按照格式转换为字符串
strcat strcpy strcmp strlen strlwr strupr
13 sizeof三个特点:
对数组,sizeof(数组名)返回值为数组所占空间
对指针,sizeof(指针名)返回值为4
对数组传参给函数,参数为数组形式时,sizeof(数组名)返回值为4
14 深度拷贝构造函数与引用:
传值调用时,程序需要为每个传递的值生成一个副本,当程序从函数中返回值时,同样也需要一个副本。
但是如果采用传址或者引用调用时,函数中传递的是对象的地址,这时候不需要对象临时建立一个副本。
深度拷贝构造函数是针对类中存在指针时,调用深度拷贝构造函数时需要将指针重新分配空间再赋值,否则拷贝的和原来的都指向一个内存,如果在拷贝的对象里操作了指针,则原来的也会发生变化。拷贝构造函数是当传递对象作为参数时,会自动调用拷贝构函数对对象进行拷贝保存。
引用使用过程中注意指针的存在,指针的内存是可以delete的,引用的却没有这种机制,如果引用的空间是一个指针的空间,指针销毁了,但是引用还在用就有可能系统崩溃。
作者:小德cyj
出处:http://www.cnblogs.com/dongzhuangdian
欢迎转载,希望注明出处