c/c++中数组退化为指针

  “数组名相当于指针,指向数组的首个成员的地址”这种表述见过很多,但实际上,这种说法很不全面,甚至在某些情况下是错误的。下面举例来说明一下。

  首先来看他们相似的特点:

  例1.

  int arr[] = {1,2,3,4,5};
  int * pointer = arr;
  printf("%d\n",arr[0]);
  printf("%d\n",*pointer);

上面两句的输出是相同的,即数组名可以转换成指向该数组的首地址的指针。

  但是如果更改一下输出语句:

  例2.

  printf("%d\n",sizeof(arr));
  printf("%d\n",sizeof(pointer));

结果就不同了,前者输出为20,后者输出为4。这里可以体现出数组名与指针的不同之处:arr表示一个数据结构的实体,其代表的含义要比指针丰富,虽然它可以牺牲掉一些信息转换成指针,20表示arr在内存中占用了20个字节的空间,而pointer仅仅是个指针,占用4个字节的空间。再来看一例:

  例3.

  int getLen(int arr[])
  {
  return sizeof(arr);
  }
  printf("%d\n",getLen(arr));

输出为什么呢?是20么?呵呵,错了,应该是4。原因在于当数组名作为参数传递给函数时,其将退化为一个指针。那为什么在例2中sizeof()接受arr为参数时没有发生退化呢?因为sizeof()并不是一个函数,而是一个操作符。

两者的区别还有:

  指针是可修改的,进行自增或自减操作。而数组名是个常量,是不可修改的,也就是说,pointer++是合法的,但是a++是非法的。

 

转载于:https://www.cnblogs.com/jiama/p/3597688.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值