//本文是学习《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;
}

注意:数组名是指针常量,区别于指针变量。所以,给数组名赋值是错误的。
数组名表示内存中分配了数组的固定位置,修改这个数组名,就会丢失数组空间,所以数组名所代表的地址不能被修改。
来源:https://www.cnblogs.com/FanPigPig/p/4685466.html