指针运算

【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】指针与指针进行运算注意什么问题?

两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。

两个指针可以进行减法操作,但必须类型相同,一般用在数组方面,在此不作赘述。

 

posted @ 2012-12-31 22:19  kaizenly  阅读(360)  评论(0编辑  收藏  举报
打赏