记住了这些就不在怕指针啦!!! #include <iostream> #include <cstdlib> #include <string> int main() { / /// 知识点 /// //1. 把int型变量赋给指针是非法的,但允许把数值0或者const int型变量赋给指针. //int *pi =0 等同于 int *pi =NULL;此NULL包含在cstdlib头文件中,而非std::NULL //2. void* 指针可以保存任何类型对象的地址 double obj =3.14; double *pd = &obj; void *pv = &obj; pv =pd; //3. 两个指针减法操作的结果是标准库类型ptrdiff_t的数据,与size_t类型一样,size_t是unsigned类型,而ptrdiff_t是signed整型 /// /// 指针和const限定符 // // //一、const对象 //1.cptr是一个指向double类型const对象的指针,const限定了cptr所指向的对象类型,而非cptr本身 //(可对指针重新指向另一个指针,不能修改指针指向的对象i的值) const double *cptr; double i; cptr = &i; *cptr = 10; error //2.一个const对象地址赋给一个非const对象的指针,编译时报错 const double dou = 1.0; double *pi = &dou; //3.void*指针也不能保存const对象地址,必须是const void* *const double d1 = 1.0; const void *cpv = &d1; //4.允许把非const对象地址赋给const对象指针 double d2 = 1.0; const void *pi = &d2; //可对指针所指的对象直接赋值 d2 =2.0; //或者间接的用非const对象指针修改其值 double *pi2 =&d2; *pi2 =10; std::cout << d2 << std::endl; //二、const指针 //1.curErr是一个指向int型对象的const指针, int errNumb = 0; int *const curErr = &errNumb; //(const指针的值不能修改即curErr不能指向其它对象) int *tmp = NULL; curErr = tmp; //可以用该指针修改它指向的对象的值 *curErr = 10; //三、指向const对象的const指针 //1.pi_ptr首先是一个const指针,指向double类型的const对象 //(都不能修改) const double pi = 3.1416; const double *const pi_ptr = π /// /// /// //容易误解的 typedef std::string *pstring; const pstring cstr=NULL; //声明const pstring时 const修饰的pstring类型,这是一个指针. //因此是把cstr定义为指向string类型对象的const指针 //等同于string *const cstr; //指针与引用的比较 //将一个指针赋给另一个指针,p1所指向的ival对象的值不变,赋值操作符修改了篇p1指针的值,使其指向不同的对象p2; int ival =1024,ival2 =2048; int *p1 =&ival,*p2 = &ival2; p1 = p2; //这个赋值操作修改了ri引用的值ival对象,而非引用本身,赋值后,这个两个引用还是分别指向原来关联的对象,这两个对象的值相等 int &ri = ival,&ri2 = ival2; ri = ri2; //指向指针的指针 int ival = 1024; int *pi = &ival; int **ppi = π //三种方式输出ival值 std::cout << ival << "/n" << *pi << "/n" << **ppi << "/n" <<std::endl; std::system("pause"); return 0; }