C/C++培训
达内IT学院
400-996-5531
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,&运算符的操作数的时候,它是一个左值,
类型为数组类型,除此之外的所有情况,数组名都是一个右值,被编译器自动转换为指针类型,这种情况下我们就说数组名是一个
指针,并且是一个指针常量。
单纯的说数组名是一个指针式是片面的,我们通常说数组名是一个指针是建立在一个前提的基础之上的,那就是:数组名作为右值
使用的时候。
总结:数组名作为右值使用时是指针常量类型,左值使用时是数组类型。
当我看到这个资料后感觉对指针和数组有了更深层次的认识, 希望大家能够更深层次的理解数组和指针,谢谢~
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved