C/C++培训
美国上市C/C++培训机构

400-111-8989

热门课程

深入理解数组与指针

  • 时间: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语言代码的小技巧

2048控制台小游戏的制作与分析流程

选择城市和中心
贵州省

广西省

海南省