zoukankan      html  css  js  c++  java
  • 指针运算

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

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

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

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    转【jenkins插件】
    【BZOJ】1492: [NOI2007]货币兑换Cash
    【BZOJ】3295: [Cqoi2011]动态逆序对
    【算法专题】卡特兰数(计数数列)
    【CodeForces】908 E. New Year and Entity Enumeration
    【CodeForces】698 C. LRU
    【CodeForces】908 D. New Year and Arbitrary Arrangement
    【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
    【BZOJ】4596: [Shoi2016]黑暗前的幻想乡
    【BZOJ】4766: 文艺计算姬
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2841050.html
Copyright © 2011-2022 走看看