博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c/c++中数组退化为指针
阅读量:4614 次
发布时间:2019-06-09

本文共 776 字,大约阅读时间需要 2 分钟。

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

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

  例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

你可能感兴趣的文章
Linux的基本命令+深入一点的网址分享
查看>>
(C#) Encoding.
查看>>
BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
查看>>
nrf51 SDK自带例程的解读
查看>>
SESSION技术
查看>>
数据结构(五)之直接插入排序
查看>>
SQL函数——LENGTH()和LENGTHB()
查看>>
vim - manual -个人笔记
查看>>
详解Javascript中prototype属性(推荐)
查看>>
angularjs实现首页轮播图
查看>>
Git 对象 和checkout 和stash的笔记
查看>>
团队项目总结2-服务器通信模型和顺序图
查看>>
hdu 1085 Holding Bin-Laden Captive!
查看>>
[周记]8.7~8.16
查看>>
递归定义
查看>>
kindeditor 代码高亮设置
查看>>
互联网产品的商业模式
查看>>
图的邻接表存储
查看>>
2018 leetcode
查看>>
各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
查看>>