c++ 指针

来源:互联网 发布:数组转list 编辑:程序博客网 时间:2024/06/07 06:07


1:指针声明:

  char*  a == char  *  a == char *a==char*a==char    *     a ; 

//*操作符的空格是可选的,在哪里添加空格对于编译器来说没有任何区别。

  char  *a :强调a是一个char类型的值

 char*  a;强调char* 是一种类型,是指向char的指针。

  char* a,b; 注意: sizeof(a)=8,sizeof(b)=1; a是一个指向char的指针,b是一个char类型

2:指针的危险

     long * a;*a=66666;
    a是一个指针但是a指向哪里并没有指明,当a是一个局部变量时在栈区分配时,a的值是一个随机的数。程序将他解释为存储66666的地址;如果a的值恰好为1000;则*a=66666;解释为把66666存储在地址为1000的地方,假如1000的地址是代码区,则也不会察觉,修改代码区的值造成巨大的危险。这种错误也很难跟踪debug。

3:指针与数字:
  (1):指针不是整形,虽然计算机通常把地址当做整数来处理,但是从概念上,指针和整数是两个截然不同的类型;
  整数可以进行加减乘除等运算但是指针进行乘除运算时没有任何意义的。
  (2):从指针和整数的操作层面上看他们也是彼此不同的,不能简单的把整数赋值给指针:
   int * a;  a=0x20000;//type mismatch 这条语句没有告诉程序,这个数字数字是一个地址:
   C99标准之前,C语言允许这样,但是C++类型不允许会报错,类型不匹配。
   可以进行强制类型转换操作告诉程序这个整数是一个地址即:a=(int *) 0x20000;

4:  指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,可以使用指针来访问内存。
     int * a=new int;
 
 5:使用delete来释放内存:
    使用delete来释放内存时能够将内存归还,但是delete仅仅释放 指向的内存,并不释放a指针本身,可以将a从新指向另外一个新分配的内存块。
new和delete一定要配对使用,否则将发生内存泄漏 memeory leak ,严重时,程序将由于不断的寻找更多内存而终止。
6:不要尝试释放已经释放的内存块,因为这样的结果将是不确定的。
   只能用delete释放使用new分配的内存,不过对于空指针使用delete是安全的。
   一般来说不要创建两个指针指向同一个内存块,因为这样将增加错误的删除同一个内存块两次的可能性。
   
 7:使用new创建动态数组
   int * p=new int[100]  delete时要用 delete [] p;
   []告诉程序,应该释放整个数组,而不仅仅是指针指向的元素,new 时带[] delete时也要带[] new 时不带[] delete时也不带[]
   
   8:使用new 和delete时 应遵循:
     a:不要使用delete来释放不是new分配的内存
b:不要使用delete释放同一个内存块两次。
c:如果使用new[]为数组分配内存,则使用delete[]释放
d:如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放
e:对空值指针应用delete是安全的