#include <stdio.h>
main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
int *p = a+1;
printf("%d %d %d \n" , a, a+1, a+2);
printf("%d %d %d \n" , *(a+1), *(ptr-1), *p);
printf("%d \n", p-a);
return 0;
}
main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
int *p = a+1;
printf("%d %d %d \n" , a, a+1, a+2);
printf("%d %d %d \n" , *(a+1), *(ptr-1), *p);
printf("%d \n", p-a);
return 0;
}
以上代码在VC环境下运行。
输出:
1245036 1245040 1245044
2 5 2
1
记住:
1. 指针的有限算术运算:自增(++), 自减(--), 加上一个整数(+, +=), 减去一个整数(-, -=), 以及减去另一个指针
2. 指针加上或减去一个整数时,并非简单地加上或减去该整数值,而是加上该整数与指针引用的对象的大小的乘积。对象的大小(字节数)取决于对象的数据类型。
3. 对于x=p1-p2,是把从p2到p1的数组元素的个数赋给x。因为除了数组元素外,我们不能认为两个相同类型的变量是在内存中连续存储的,所以指针算术运算除了用于数组外没有什么意义。
4. 常见的程序设计错误有:
(1)对不指向数组的指针进行算术运算。
(2)把不指向同一数组的两个指针相减或比较。
(3)指针算术运算的结果超出了数组的范围。
5. 指针类型转换问题:如果两个指针类型相同,那么可以把一个指针赋给另一个指针,否则必须用强制类型转换运算符把赋值运算符右边的指针的类型转换为赋值运算符左边指针的类型。指向void *类型的指针是例外。任何类型的指针都可以赋给指向void类型的指针,指向void类型的指针也可以赋给任何类型的指针。这两种情况都不需要使用强制类型转换。