指针和数组的对比

         指针和数组在不少地方可以互换使用,但两者并不等价。数组名对应着(而不是指向)一块内存,其地址和大小在生命周期内保持不变,只有数组的内容可以改变;而指针变量则是一个变量,它可以存放任意相同数据类型变量的地址值,可以随时指向其他内存块,所以指针比数组更加灵活。

 

预防指针错误方法:

 

一般指针:

           (1)声明指针时一定要初始化,如不初始化就将其置为NULL,否则该指针会指向一个不确定的地方。

           (2)delete指针以后,一定要将其置为NULL。

           (3)当指针指向数组时,谨防指针操作越界。

           (4)避免指针指向一个已经消失的局部变量。

对于动态内存指针:

           (5)指针消亡了,并不表示它所指向的动态内存会被自动释放。    

           (6)动态内存被释放了,并不表示指向该动态内存的指针会消亡或自动变成NULL指针。

 

下面通过例子详解指针数组区别:

 

  1. //程序1 :指针和数组区别。
  2. #include <iostream>
  3. using namespace std;
  4. //测试函数
  5. void main(void)
  6. {
  7.     //数组定义,内存中只分配数组空间
  8.     char a[]="hello";     //定义并初始化数组
  9.     a[0]='T';             //数组的元素可以改变的
  10.     cout<<a<<endl;        //显示:Tello   
  11.     
  12.     //定义一个指针变量,且指针指向了一个常量字符串
  13.     //内存中分配两个空间:指针变量空间;常量字符串空间
  14.     char *p="World";
  15.     //p[0]=x;         //该语句编译通过,但运行时会发现p指向一个常量,该语句试图修改常量,错误。
  16.     cout<<p<<endl;    //显示:World
  17.     //数组赋值的方法
  18.     char b[]="hello";
  19.     char c[10];
  20.     strcpy(c,b);        //数组赋值,不能用c=b,会发生错误
  21.     if(0==strcmp(c,b))   //数组比较,不能用if(c==b)
  22.     {
  23.         cout<<c<<endl;   //显示:hello
  24.     }
  25.     //复制指针所指向的字符串的方法
  26.     int len=strlen(b);
  27.     char *p2=new char[len+1];          //+1用来存放'/0'
  28.     if(NULL==p2)
  29.     {
  30.         cout<<"动态内存分配失败。/n";
  31.         exit(0);
  32.     }
  33.     strcpy(p2,b);           //不要用p2=b,如这样用,则只是p2指向了数组b而已,而刚才p2用new申请的那一部分内存空间则泄露了
  34.     if(0==strcmp(p2,b))     //不要用if(p2==b),那样只能判断p2是否指向b
  35.     {
  36.         cout<<p2<<endl;     //显示:hello
  37.     }
  38.     delete p2;
  39.     p2=NULL;
  40.     
  41.     //字符指针变量的长度和该指针所指向的字符串的长度的区别
  42.     char d[]="Hello world";   //d是一个数组。其空间大小是数组的空间大小
  43.     char *p3=d;               //p3只是一个指针变量,其大小只是变量本身的大小
  44.     cout<<sizeof(d)<<endl;    //12字节
  45.     cout<<sizeof(p3)<<endl;   //4字节 
  46. }

输出结果:

Tello
World
hello
hello
12
4
Press any key to continue

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值