[Investor Relations]  |  官方微博

C/C++培训

美国上市公司 · 亿元级外企Java培训企业

  • 全国服务监督电话400-827-0010
C++培训 > 学习笔记 > 深入理解数组与指针
  • 深入理解数组与指针

    发布:陈帅  来源: 达内华中大学生实训基  时间: 2015年09月06日

  • 关于这次考试内心比较感慨, 关于两个一摸一样的题目错了两次,是关于指针和数组的区别,其实我一直以来都觉得数组和指针根本不是一个东西,无论它是如何的变...

  • 关于这次考试内心比较感慨, 关于两个一摸一样的题目错了两次,是关于指针和数组的区别,其实我一直以来都觉得数组和指针根本不是一个东西,无论它是如何的变化,当看到这一题的B选项的时候, 我毫不犹豫就勾选了B答案,因为它错的太离谱。下面即是这个选项:

    B 数组其实也是一种特殊的指针,是常量指针

    首先,我最敢肯定的错误, 常量指针和指针常量的问题:

    const int *p_itest1;

    int * const p_itest2;

    p_itest1为常量指针

    p_itest2为指针常量

    如果说数组能和常量指针做比较,我找不到任何的共同点(也许可能会有)

    下面我主要对比的是指针常量和数组的比较.

    指针常量和数组的常见操作:

    初始化,类型转换,取地址,访问一组存储区,计算大小

    两者比较

    1.初始化问题

    数组:初始化必须把每个存储区赋值,默认为0,不能把地址赋值给数组名,并且为每个存储区已经分配好了空间

    指针常量:必须把地址赋值给指针常量,存储区只有int大小,用来保留地址,指针所指向的一组内容都不是因为定义指针常量而分配的空间,调用malloc等才能有自己的一组存储区

    2.类型转换问题

    数组:无法丢失常量属性

    指针常量:可以通过类型转换消除其常量属性,然后进行改变指向

    3.二级地址问题

    数组:数组名的地址仍然等于一级地址的值

    指针常量:指针常量的地址绝对不可能等于它本身的值

    4.存储区访问问题

    数组和指针相同

    5.sizeof

    数组:一组存储区的大小

    指针常量:sizeof(int)的大小

    猜想:

    如果说五个里面满足一个即表示相同,那么

    1:局部变量是不是数组呢, 第一条满足

    2:函数指针是不是数组呢, 第三条满足

    3: int a; a是不是数组呢, 第五条满足

    查阅资料:

    数组名的本质是代表数组对象的变量名,是一个左值,是一个不能被改变的左值。但是由于在程序中不保存数组的大小,所以

    通过数组名只能访问数组的左值,不能访问数组的右值。由于这个原因,数组名在作为右值使用的时候被赋予另外一个新的定义

    ---指向数组第一个元素的指针,这就是array-to-pointer转换原则。

    数组名在程序中作为左值使用的情况屈指可数---在大部分情况下数组名都是作为右值使用的,这是它是一个指针,一个指向数组

    第一个元素的指针,一个指向不能再被改变的指针---因此是一个指针常量。

    那么数组名在什么情况下作为左值使用呢?根据标准规定,只有当数组名作为sizeof,&运算符的操作数的时候,它是一个左值,

    类型为数组类型,除此之外的所有情况,数组名都是一个右值,被编译器自动转换为指针类型,这种情况下我们就说数组名是一个

    指针,并且是一个指针常量。

    单纯的说数组名是一个指针式是片面的,我们通常说数组名是一个指针是建立在一个前提的基础之上的,那就是:数组名作为右值

    使用的时候。

    总结:数组名作为右值使用时是指针常量类型,左值使用时是数组类型。

    当我看到这个资料后感觉对指针和数组有了更深层次的认识, 希望大家能够更深层次的理解数组和指针,谢谢~

  • 上一篇:2048控制台小游戏的制作与分析流程

    下一篇:6个优化C语言代码的小技巧

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56