指针和数组名的区别

      C/C++应该是大学里最先接触的编程语言,它们的重要性不言而喻。但是我始终抱着“数组名就是指针”的错误信条到现在,可能是因为大学老师错误的讲解使我一直保留着这种误解。指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用,所以也难免在学习中将两者混淆。这里介绍下指针和数组名的区别:

 

     1.指针和数组名占据的内存空间大小不一样,如下程序1:

  1. char str[10];
  2. char *pstr=str;
  3. cout<<sizeof(str)<<endl;
  4. cout<<sizeof(pstr);
  5. 第一行输出结果是:10,第二行输出结果是:4

      从这里我们可以看出:数组名对应着(而不是指向)一块内存(数组所占的内存区域)或者说是指代数组这种数据结构,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针对应着一个占据4个字节(Win32)的内存区域,而指向这4个字节所存储的地址所对应的内存单元,它可以指向任意类型的内存块。因此,sizeof(str)值为数组占据的内存空间大小即10个字节,而sizeof(pstr)值为指针的值占据的内存空间大小即4个字节。

 

    

    2.数组名不是指针,但是在一定的情况下转换为指代数组的首地址的指针,而这个数组名转为的指针只能是指针常量。
    在以下两种情况下才能进行这种转换:
    a.在程序1第二行代码中,将数组名直接赋值给指针,此时数组名转换为指向数组的首单元的常量指针。
    b.直接将数组名作为指针形参的时候,数组名则转换为指向数组的首单元的常量指针进行传递,如下函数:

 

  1. void fun(char str[])
  2. {
  3. cout<<sizeof(str)<<endl;
  4. str++;
  5. }
  6. 输出结果为4,此时参数数组被转换为char* 指针类型

      注意:数组名作为函数形参进行传递时,在子函数体内,它已经不再是一个指针常量,而是变成一个真正的指针,可以进 行增减等操作,可以被修改。所以函数中子程序第一条语句输出的sizeof(str)的值为4.

 

 

 

既然数组名可以被看作指针常量,而常量是不能修改的,那么如下代码是不允许的

  1. char str[10];
  2. str++;

但如下代码则合法的:

  1. char str[10];
  2. char *pstr=str;
  3. pstr++;

 --------------------------------------------------------------------------

    3.使用指针访问数组和使用数组名访问数组本质不同。

  1. char str[7]="ksarea";
  2. char *pstr=str;
  3. cout<<str[3]<<pstr[3];
  4. 其中str[3]pstr[3]返回的都是字符'r'但是编译器产生的执行代码却不一样。对于str[3]执行代码是从str开始,向后移动两个字节,然后取出其中的字符;而对于pstr[3]执行代码是从pstr中取出地址,然后在其上加3然后取出对应内存中的字符。当然,如果pstr是指向int型的指针,那么pstr[3]的处理过程是从pstr中取出地址,然后在其上加上3*sizeof(int),最后取出对应内存中的字符,其他的数据类型依次类推

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值