...
for(i=0;i<20;i++)
{
(*ptr)++;
ptr++;
}
这个例子将整型数组中各个单元的值加 1。由于每次循环都将指针 ptr 加 1,所以每次循环都能访问数
组的下一个单元。
再看例子:
例四:
1、chara[20];
2、int*ptr=a;
...
...
3、ptr+=5;
在这个例子中,ptr 被加上了 5,编译器是这样处理的:将指针 ptr 的值加上 5 乘 sizeof(int),在
32 位程序中就是加上了5乘4=20。由于 地址的单位是字节,故现在的 ptr 所指向的地址比起加 5 后的 ptr
所指向的地址来说,向高地址方向移动了 20 个字节。在这个例子中,没加 5 前的 ptr 指向 数组 a 的第 0
号单元开始的四个字节,加 5 后,ptr 已经指向了数组 a 的合法范围之外了。虽然这种情况在应用上会出
问题,但在语法上却是可以的。这也体现出 了指针的灵活性。
如果上例中,ptr 是被减去 5,那么处理过程大同小异,只不过 ptr 的值是被减去 5 乘 sizeof(int),新的
ptr 指向的地址将比原来的 ptr 所指向的地址向低地址方向移动了 20 个字节。
总结一下,一个指针 ptrold 加上一个整数 n 后,结果是一个新的指针 ptrnew,ptrnew 的类型和 ptrold
的类型相同,ptrnew 所指向 的类型和 ptrold 所指向的类型也相同。ptrnew 的值将比 ptrold 的值增加了
n 乘 sizeof(ptrold 所指向的类型)个字节。就是说, ptrnew 所指向的内存区将比 ptrold 所指向的内存区
向高地址方向移动了 n 乘 sizeof(ptrold 所指向的类型)个字节。
一 个指针 ptrold 减去一个整数 n 后,结果是一个新的指针 ptrnew,ptrnew 的类型和 ptrold 的类型
相同,ptrnew 所指向的类型和 ptrold 所指向的类型也相同。ptrnew 的值将比 ptrold 的值减少了 n 乘
sizeof(ptrold 所指向的类型)个字节,就是说, ptrnew 所指向的内存区将比 ptrold 所指向的内存区向低
地址方向移动了 n 乘 sizeof(ptrold 所指向的类型)个字节。
运算符&和*
这里&是取地址运算符,*是...书上叫做"间接运算符"。
&a 的运算结果是一个指针,指针的类型是 a 的类型加个*,指针所指向的类型是 a 的类型,指针所指
向的地址嘛,那就是 a 的地址。
*p 的运算结果就五花八门了。总之*p 的结果是 p 所指向的东西,这个东西有这些特点:它的类型是 p
指向的类型,它所占用的地址是 p 所指向的地址。
例五:
inta=12;
intb;
int*p;
int**ptr;