指针运算(C++)

一世执手 提交于 2020-04-06 00:31:34

//本文是学习《C++程序设计教程--设计思想与实现》的笔记。

1、指针可以进行加减运算。

数组名本身,没有方括号和下标,实际上是一个地址,表示数组起始地址。

整型数组的数组名本事得到一整数地址,字符数组的数组名得到一字符地址。

可以把数组起始地址赋值给一指针,通过移动指针(加减指针)来对数组元素进行操作。

例如:下面程序用指针运算来计算数组元素的和:

#include<iostream.h>
int main(){
int iArray[10];
int sum = 0;
int * iPtr = iArray;//用数组名 iArray给指针初始化
//int *iPtr;
//iPtr = iArray;这两句和上面一句是相等的//iPtr = &iArray[0];这句与左边那句相同 
for(int i = 0;i < 10;i++){    
iArray[i] = i * 2;    
cout<<"*iArray["<<i<<"]"<<"is "<<iArray[i]<<endl;
} 
for(int idex = 0; idex < 10; idex++){
sum += *iPtr;
cout<<"*iPtr is "<<*iPtr<<endl;
iPtr++; 

}
cout<<"sum is"<<sum<<endl;
}

 

 

sum += *iPtr;  iPtr++; 等同于:sum += *(iPtr++);又因为++与*的操作符优先级相同,它们是右结合的,所以等式等同于sum += *iPtr++;

由于指针是具有某个数据类型的地址,所以指针运算都是以数据类型为单位展开的。

 

#include<iostream.h>
int main(){
int iArray[10];
int * iPtr = iArray;//用数组名 iArray给指针初始化
//int *iPtr;
//iPtr = iArray;这两句和上面一句是相等的//iPtr = &iArray[0];这句与左边那句相同 
for(int i = 0;i < 10;i++){    
iArray[i] = i * 2;    

} 
for(int index = 0; index < 10; index++){

cout<<"&Array["<<index<<"]:"<<iPtr<<"=>"
<<*iPtr<<endl ;
iPtr++; 
}
}

 

只有加减法可以用于指针运算。

2、指针与数组

数组名可以拿来初始化指针,数组名就是数组第一个元素地址。即对于数组a,有:a等于&a[0]。此外,对于:

int a[100];

int *iPtr = a;

 

我们有第i个元素:

a[i] 等价于 *(a+i) 等价于 iPtr[i] 等价于 *(iPtr+i)


a[i]表示数组第i个元素的值。而a+i表示第i个元素的地址,对其间接访问,即*(a+i)就表示第i给的元素的值。另外,下标操作是针对地址的而不仅仅是针对数组名的,所以iPtr[i]也表示第i个元素的值。

 

i个元素的地址:

&a[i] 等价于 a+i 等价于 iPtr+i 等久 &iPtr[i]

 

数组名本来就是一个指针,它的类型是指向数组元素的指针。&a[i]表示数组第i个元素的地址。

#include<iostream.h>
int * iPtr;
int sum1,sum2,sum3,sum4,sum5;
int iArray[]={
1,4,3,7,13,32,21,48,16,30
};
int main(){

int size,n;
size = sizeof(iArray)/sizeof(*iArray);
for(n=0;n<size;n++)//方法一
{
sum1 += iArray[n];
} 

iPtr = iArray;
for(n=0;n<size;n++){

sum2 += *iPtr++;
}

iPtr = iArray;//此处不能省略,因为上面一个方法修改了iPtr 
for(n=0;n<size;n++){
sum3 += *(iPtr + n);
}

for(n=0;n<size;n++){
sum4 += iPtr[n];
}

for(n=0;n<size;n++){

sum5 += *(iArray + n);
} 
cout<<sum1<<endl
<<sum2<<endl
<<sum3<<endl
<<sum4<<endl
<<sum5<<endl; 
}

 

注意:数组名是指针常量,区别于指针变量。所以,给数组名赋值是错误的。

数组名表示内存中分配了数组的固定位置,修改这个数组名,就会丢失数组空间,所以数组名所代表的地址不能被修改。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!