博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组名和指针的区别
阅读量:2382 次
发布时间:2019-05-10

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

此文章转载自:

数组名和指针之间,经常会交替使用这两个变量,比如,把一个指针当成数组来使用,或者是把数组名赋值给指针,通过指针来访问数组成员变量,但是,数组名和指针之间到底有什么样的联系与区别,以及什么情况下该使用指针,什么情况下该使用数组名,我对这个做一个小小的解读。。 

这里写图片描述 
上图中,定义一个数组,数组名为arr,分别打印arr本身的地址arr首元素的地址,以及arr本身,以整型形式输出,发现,这三者的值是相同的。这里说明了一下这种情况。 
这里写图片描述 
在说明这种情况之前,我们先了解一下变量的三要素: 
红色圈代表:变量名称(如同人名。。) 
绿色圈代表:该变量,即名为arr变量自己的地址。该地址存储了arr变量 
蓝色圈代表:arr的值,为arr所指对象的地址。 
所以一个普通变量arr!=&arr的,arr的值和arr自身的地址是不同的,指针变量就是一个类型为指针的普通变量。


而在上面的运行结果中,我们发现arr==&arr,这说明arr的地址就是arr,arr代表一个地址,arr本身就是一个地址,又根据arr==&arr[0]可知,arr是arr数组首元素的地址,所以arr作为数组名时,它的红圈,绿圈和篮圈代表的是同一个含义——数组首元素的地址。 

这是数组名和指针不同的第一点: 
数组名取地址得到的是数组名所指元素的地址。 
对指针取地址得到的是指针变量自身的地址。


区别2: 

数组是固定大小的,数组一经定义,那么数组名就是一个指向数组首元素类型的常量指针,也就是说数组名是不允许更改的,而指针可以更改。 
数组名是常量指针,指针是变量指针。


区别3: 

1.当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,对指针sizeof得到的是指针类型的字节数。 
这里写图片描述

2.对数组名取&和对指针取&的意义不同。 

这里写图片描述 
上图可以看到对arr取地址后加1后,增大了36个字节,而对指针p取地址后加一,只增大了4个字节,所以说它们取地址后加一的能力不同。 
这两种情况下,数组不再当成常量指针来使用。 
总结: 
1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。

2.当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而指针仍当成指向一个元素的变量指针来使用。

对于使用指针和数组下标的选择: 

系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率是远远大于数组名的访问效率的。 
但是只有在指针正确访问时,才成比下标法更有效率。 
下标法更加容易理解,在可读性方面,也更加的具有优势,具体怎么选择,也没有一定的说法。

你可能感兴趣的文章
Linux下任务调度服务crond使用
查看>>
ZeroMQ的订阅发布(publish-subscribe)模式
查看>>
使用redis存储全球IP库
查看>>
Snappy Java API简介
查看>>
C/C++中正则表达式库RE2的使用
查看>>
HBase Java API(1.2.X)使用简介
查看>>
Java:实现比较接口时,应该全面的进行各种情况的比较
查看>>
python3.*下用mob_pbxproj自动化修改配置
查看>>
使用fir打包,测试跳转安装的坑
查看>>
版本号大小判断,适用规则(X.X.X.X........)
查看>>
关于Objective-C方法签名规则的说明
查看>>
libxml2.dylb 添加后找不到<libxml/tree.h> 头文件
查看>>
关于 [[self class] alloc]的理解
查看>>
Eclipse导入Web项目后代码不报错但项目报错(左上角有红叉)解决方案
查看>>
List、Set、数据结构、Collections
查看>>
Sudoku Solver
查看>>
Combination Sum
查看>>
First Missing Positive
查看>>
Trapping Rain Water
查看>>
Permutation Sequence
查看>>