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