C语言的指针大归纳Three

作者: 遮天的龙 | 来源:发表于2016-06-30 11:10 被阅读144次

    【指针的算术运算】

    指针运算与普通数值运算不同,先给个例子吧;
    eg:

    char a[20];
    int *p =(int *)a; //强制类型转换并不会改变a 的类型
    p ++;
    

    /* 结合【C语言的指针大归纳Two】的知识,我们可以清晰的知道*/:

      指针p 的类型==>int*,
      指向的类型==>int,
      被初始化==>指向整型变量a。
    

    假如是在32 位机中的。
    在程序p++中,指针p 被加了1,编译器是这样处理的:
      它把指针p  的值 加上了sizeof(int),相当于被加上了4(int类型的大小)。
    由于地址是用字节做单位的,故p 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。
    但由于char 类型的长度是一个字节,所以,原来p  是指向数组a 的第0 号单元开始的四个字节,
    此时指向了数组a 中从第4 号单元开始的四个字节。
    

    用一个指针和一个循环来遍历一个数组:
    eg:

    int a [40]={0};
    int *p =a ;
    for(i=0;i<40;i++)
    {
      (*p )++;
       p ++;
    }
    

    将整型数组中各个单元的值加1。由于每次循环都将指针p 
    加1 个单元,所以每次循环都能访问数组的下一个单元。
    

    指针的灵活性

    char a[20]="cai  jin  long ";
    int *p =(int *)a;
    p +=5;  //  假如是p - =5;呢?
    

    p +=5;语句中编译器是这样处理的:将指针p 的值加上5 乘sizeof(int),  即5*4=20。
    因为地址的单位是字节,所以现在的p所指向的地址比起加5后的p 所指向的地址来说,
    向高地址方向移动了20 个字节。
    虽然p 已经指向了数组a 的合法范围之外了,但在语法上还是可行的。
    
    如果是p - =5;语句,结果差不多。 
    p 的值是被减去5 乘sizeof(int),新的p 指向的地址将
    比原来的p 所指向的地址向低地址方向移动了20 个字节。
    

    相关文章

      网友评论

        本文标题:C语言的指针大归纳Three

        本文链接:https://www.haomeiwen.com/subject/kagxjttx.html