【1】指针可以运算吗?
可以。指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,以单元为单位。
下面请看指针运算举例。
示例代码如下:
1 char a[20]; 2 3 int *ptr=(int *)a; //强制类型转换并不会改变a的类型 4 5 ptr++;
在上例中,指针ptr 的类型是int*,它指向的类型是int。它被初始化为指向整型变量a。
接下来的第3 句中,指针ptr被加了1,编译器是这样处理的:
它把指针ptr 的值加上了sizeof(int),在32位程序中,是被加上了4。
因为在32 位程序中,int 占4 个字节。
由于地址是用字节做单位的,故ptr 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。
由于char 类型的长度是一个字节。
所以,原来ptr 是指向数组a的第0 号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。
【2】指针运算有何作用?
最常见的应用可以借助指针这种特性遍历一个数组。请看示例代码如下:
1 #include<iostream> 2 using namespace std; 3 4 void main() 5 { 6 int array[20]={0}; 7 int *ptr = array; 8 for(int i = 0; i < 20; i++) 9 { 10 (*ptr)++; 11 cout<<array[i]<<" "; 12 ptr++; 13 } 14 } 15 16 //The result of this 17 /* 18 *1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 19 */
这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1 个单元,所以每次循环都能访问数组的下一个单元。
【3】指针运算在实际应用中应该注意哪些问题?
世间万物有一个规律:只要是可以变化的事物,问题永远在它的临界点。
计算机是对现实的模拟,指针也不例外。指针既然可以运算,那么加或者减越出范围之外呢?
示例代码如下:
1 char a[20]="You_are_a_girl"; 2 3 int *ptr = (int *) a; 4 5 ptr += 5;
在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr 的值加上5 乘sizeof(int),在32 位程序中就是加上了5 乘4=20。
由于地址的单位是字节,故现在的ptr 所指向的地址比起加5 后的ptr 所指向的地址来说,向高地址方向移动了20 个字节。
在这个例子中,没加5前的ptr 指向数组a 的第0号单元开始的四个字节,加5后,ptr 已经指向了数组a 的合法范围之外了。
虽然这种情况在应用上会出问题,但在语法上却是可以的。某种意义上这也体现出了指针的灵活性。
总结一下:
一个指针ptrold 加(减)一个整数n 后,结果是一个新的指针ptrnew,ptrnew 的类型和ptrold 的类型相同,ptrnew 所指向的类型和ptrold所指向的类型也相同。
ptrnew 的值将比ptrold 的值增加(减少)了n 乘sizeof(ptrold 所指向的类型)个字节。
也就是说,ptrnew 所指向的内存区将比ptrold 所指向的内存区向高(低)地址方向移动了n 乘sizeof(ptrold 所指向的类型)个字节。
【4】指针与指针进行运算注意什么问题?
两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。
两个指针可以进行减法操作,但必须类型相同,一般用在数组方面,在此不作赘述。