5.6 数组与指针的关系
2016-06-13 08:56
253 查看
数组名、指针和指针运算
◆ 指针和数组的关系数组名被看作该数组的第一个元素在内存中的首地址(仅在sizeof操作中例外,该操作给出数组所占内存大小)。数组在内存的首地址,逻辑上可看作是存放在该数组的数组名中的。
数组名在表达式中被自动转换为一个指向数组第一个元素的指针常量。数组名中所放的地址是不可改变的,所以称指针常量(即隐含说明“元素类型* const数组名”)。
数组名指向的目标是数组元素,而不是数组整体。
fibon<-->&fibon[0]
fibon<-->&fibon[0]
(数组的第一个元素的地址)
*fibon<-->fibon[0]
(数组的第一个元素)
fibon+1<-->&fibon[1]
*(fibon+1)<-->fibon[1]
C++语言的下标运算符[ ]是以指针作为操作数的,fibon[i]被编译系统解释为*(fibon+i),即表示为fibon所指(固定不可变)元素向后第i个元素。无论我们是以下标方式或指针方式存取数组元素,系统都转换为指针方法实现。这样做对多维数组尤其方便。逻辑上有两种方式,物理上只有一种方式。
◆ 指针的算术运算和关系运算:
指针变量与整型量的加减表示移动指针,以指向当前目标前面或后面的若干个位置的目标。指针与整型量i的加减等于指针值(地址)与i*sizeof(目标类型)积的加减,得出新的地址。(查看动画演示)
只有当两个同类型的指针变量指向同一个数组时才可以进行减法运算,结果表示由第一个指针所指元素到第二个指针所指元素之间的元素数量。这里数量算头不算尾。
当且仅当两个同类型指针变量指向同一数组中的元素时,可以用关系运算符>,==,!=等进行比较,比较规则是指向后面元素的指针大,指向同一元素的相等。
指针同样可以进行”++”,”--“运算,运算结果也是指向后一个或前一个数组元素。
【例5.8】指针与数组相关的运算。
#include <iostream>
using namespace std;
int main(){
int i,fibon[10]={0,1,1,2,3,5,8,13,21,34},*pfib1,*pfib2;
pfib1=pfib2=fibon; //也可以用pfib1=pfib2=&fibon[0]
cout<<"使用数组显示斐波那契数列"<<endl;
for(i=0;i<10;i++)
cout<<fibon[i]<<'\t'<<pfib1[i]<<endl;
cout<<"使用指针显示斐波那契数列"<<endl;
for(i=0;i<10;i++)
cout<<*(fibon+i)<<'\t'<<*pfib2++<<endl; //注意:fibon++是错误的,而pfib2++是正确的
cout<<"显示指针相减,应为数组长度:";
cout<<pfib2-pfib1<<endl; //pfib2已指向数组末尾
return 0;
}
指针作为函数参数
◆ 引用调用与指针传值调用C++中函数的参数的基本使用方法是传值。为了弥补单纯传值的不足,以引用作为函数的参数,从逻辑上讲引用是别名,在函数中对参数的操作,就是对实参的操作,而在物理上是传实参的地址。
将指针用作函数的参数时,传的仍然是值,指针的值,这个值就是指针所指向的变量或对象的内存首地址,在物理上传的是指针的值,在逻辑上讲是把另一个变量的地址传过去了,可以看作传地址。
建议在函数参数传递中,能用“引用”时绝不用“指针”。
【例5.9】用指针代替引用实现两数据的交换。
#include<iostream>
using namespace std;
void swap(double *d1,double *d2){
double temp;
temp=*d1;*d1=*d2;*d2=temp;
}
int main(void){
double x,y;
cout<<"请输入x和y的值"<<'\n';
cin>>x>>y;
cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
swap(&x,&y);
cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
return 0;
}
◆ 指针作为返回值
函数的返回值也可以是指针。如希望返回多个值,可以用引用参数或指针参数来等效实现,如果我们希望返回一个数组,并且这个数组生命期不在该函数中消亡,我们可以返回一个指向该数组的指针。
相关文章推荐
- 5.5 this 指针
- YYCache 源码分析(二)
- POJ3342 Party at Hali-Bula(树形DP)
- 5.4 指针与地址
- java中hashcode()和equals()的详解
- 预测维护和预测分析
- IP进制转换
- 创业的真谛是顺势而为,借船过海!
- [李景山php]每天laravel-20160828|McryptEncrypter-2
- 装完DZ7后,打开ecshop首页出现:Warning: strpos() [function.strpos]: Empty delimiter
- YYCache 源码分析(一)
- 基于密度的聚类算法C语言实现--DBSCAN
- 如何使用Docker部署Go Web应用程序
- 5.3 指针与地址
- 百度命不久矣?他为什么这么说?
- 5.2 多维数组
- Visual Assist X 破解
- Android:控件GridView的使用
- 5.1 数组
- 交叉熵代价函数