(七)数据的向导:指针

来源:互联网 发布:淘宝零食店加盟 编辑:程序博客网 时间:2024/04/27 04:12


1、空指针:int *p=0;
      空指针中,在C中指NULL,但C++中指的是0。因此,在C++中判断是否空指针,与0比较即可。



2、char *p="abc";   在常量区
      char   p[]="abc“;在栈区



3、[]与()同级,比*高。 
      const int a=3;      最终的内容是常量
      const  int   *p=&a;       指向常量内容的指针,  指向常量的指针:常量指针
      int *const p=&a;           指针是常量(const p) ,       指针常量  仍是指针,但指针是常量,指针不能变化
const int *const p=&a;    指向常量的常量指针。指针本身是常量,指向的内容也是常量,前后夹击,一点都不能改变。





4、指针数组:  *a[10]            先p[] 是数组,再*由指针组成。指针数组:由指针构成的数组。
      数组指针:(*a)[10]      []与(()同级,左向右,先()故是指针,再数组。数组指针:即指向一个数组的指针。



5、数组与指针
      特别注意的是,三维数组指针,对于a[3][4][4],其中的a[2][2][2]从顺序上来说在a+2X3+2X4+2处,但是从类型上来说C++检查得十分严格。
                  比如a[2][2][2],用指针表示为:*(*(*(a+2)+2)+2)     二纵高,二横行,二横列上
                                             但若*(a+2X3+2X4+2)则只是表示是*(a+16)纵高处的第一个元素的地址。


6、string是C++,<cstring>是兼容C的C++,主要函数有:
      strcat(char *p,const char* p2)
      strcat(char  *p1,const char* p2,unsigned int Len2)
                     char  name[50]="Bing";
                     char  surname[ ]="Crosby";
                    strcat(name,"   ");
                    strcat(name,surname);//必须测定name是否容纳下surname,sizeof(name)/sizeof(name[0] >  strlen(name) +strlen(surname)
       还有复制:strcpy()、比较strcmp( )、搜索strchr( )


7、堆(heap)栈(stack)
     除了静态变量在特殊的一小块内存(最低地址)外,就是堆(稍高于静态地址),然后再是栈(最高地址),堆是由低到高进行分配,栈是由高到低进行分配。
     因此两都都是面向进行分配。
     平时的基本数据类型是在栈中,当用new时,就在堆中进行分配。用delete就是释放堆中的空间(本身所指的地址并没变化)。
     int   *p=new int(3);
     cout<<p<<endl;
     delete  p;
     cout<<p<<endl;//可以看到两个p的地址是一样的,尽管已经释放了。因此P此时是一个垃圾指针,,为了避免,就接一句让它置空
      p=0;   //指针置空。



8、动态分配数组应注意的事项:
     1、删除时,应加空方括号:    
                       int  *p=new int[100];  //不能初始化
                       delete [ ] p;
      2、动态分配不能直接初始化只能显示的初始化。



9、动态分配的毛病:内存泄露和内存碎片
      一、内存泄露:
                 当动态分配后,没有释放,但这个指针就改变了方向。而堆中原分配的内存已经“标记”上占用,造成这部分内存无法释放。
                 当动态分配后,由于过了作用域,这个指针“消亡”了,同样分配的内存仍然在占用无法释放。
     二、内存碎片
                在动态分配中,有些不断在分配,有些不断在释放,造成堆中的内存区域并不是连续的占用,这就是碎片,与磁盘碎片一样。
                 唯一不同的是,当再次分配一个大的内存块时,它只能选取能连续容纳的内存块,如果分配不出这个内存块,就会分配失败。




10、reinterpret_case<类型>(表达式) 强制转换成任意类型。因此很危险的操作,比如把指针强制转为整形,把整形强制转换成指针。
         reinterpret:重新解释    interpret:解释







原创粉丝点击