• C语言指针用法详解(二) 指针的算术运算


    例题1:
    • Question : 
    char a[20];
    int *ptr = (int  * )a;
    ptr++
    • Practice :
    • Reason :
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        char a[20];
        int *ptr = (int  * )a;///  强制类型转换不会改变a的类型
        /***
        **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
        **   ptr 的类型是 int* , 指向的类型是 int , 指向整形变量 a
        ***/
        cout<<" befor : " << ptr<<endl;
        ptr++;
        cout<< " sizeof (ptr) "<< sizeof(ptr)<<endl;
        /***
        **   ptr 类型是指针,指针的自增,当然是增加自身的大小了
        **   sizeof(ptr)  为4, ptr 增加4
        ***/
        cout<<" after : "<<ptr<<endl;
    }
    


    例题2:
    • Question :    
       int arr[20] = {0};
        int *ptr = arr;
        for (int i=0; i<20; i++)
        {
              (*ptr)++;
               ptr++;
        }
    • Practice :
    • Reason :
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int arr[20] = {0};
        int *ptr = arr;
        /***
        **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
        **   ptr 的类型是 int* , 指向的类型是 int , 指向 arr
        ***/
        for (int i=0; i<20; i++)
        {
            (*ptr)++; /// 改变的是 ptr 指向的值
            ptr++; /// 改变的是 ptr 指向的地址  ,再次验证 ptr  自增的是 sizeof(ptr)
            cout<<"  ptr  : "<<ptr<<endl;
        }
    }
    


    例题3:

    • Question :    
      char a[20] ="You_are_a_girl;
        int *ptr = (int *)a;
        ptr += 5;
    • Practice:

    • Reason
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        char a[20] = "You_are_a_girl";
        int *ptr = (int * )a;
        /***
        **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
        **   ptr 的类型是 int* , 指向的类型是 int , 指向 a
        ***/
        cout<<"  ptr  : "<<ptr<<endl;
        ptr += 5;
        /***
    ** ptr 强制转换 指向(int), 本身的类型是 ( int * ) ** ptr + 5 : 编译器处理为 ptr 的值加上 5 * sizeof(int) ** ptr 向高地址移动20个字节, 此时超出a 的合法范围(a的声明是以 char单位分配的 ), 但是语法可以 ** ***/ cout<<" ptr : "<<ptr<<endl; }


    例题4:

    • Question :    
     char a[20] = "You_are_a_girl";
        char *p = a;
        char **ptr = &p;
        printf("**ptr = %c 
    ", **ptr);
        ptr++;
        printf("*ptr = %c 
    ", **ptr);
    
    • Practice :
    • Reason
    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        char a[20] = "You_are_a_girl";
        char *p = a;
        char **ptr = &p;
        /***
        **   吾日三醒指针:指针的类型,指针指向的类型,指针指向哪里
        **   p 的类型是 char* , 指向的类型是 char , 指向 a
        **   ptr 的类型是 char ** , 指向的类型是 char* , 指向 &p
        ***/
        printf("**ptr = %c 
    ", **ptr);
        /*cout<<" *p "<<*p<<endl;
        cout<<" p "<<p<<endl;*/
        
        cout<<" ptr "<<ptr<<endl;
        ptr++;
        cout<<" ptr "<<ptr<<endl;
        cout<<" sizeof(char *) "<<sizeof(char *)<<endl;
        /// ptr自增 ,增加的是它指向的类型的 所占字节
        printf("*ptr = %c 
    ", **ptr);
        /// 此时 *(ptr) 没人知道回事什么,也许是随机值,也许是非法操作
    }

    总结:
    1. 一个指针ptrold 加或减一个整数n后,结果是一个新的指针ptrnew 
    • ptrold指针的类型 和 ptrnew指针的类型 相同
    • ptrold指针指向的类型 和 ptrnew指针指向的类型 相同
    • ptrold指针的指向(值)和 ptrnew指针的指向(值)相差为指向类型的字节数
    2.两个指针不能作加法运算,非法操作
    3.两个指针可以作减法操作,但必须类型相同
     
    吐吐吐吐吐吐吐槽: 博客园好难用。。。。。。 
  • 相关阅读:
    C#多线程的简单理解
    CSS中图片水平垂直居中方法小结
    浅析JavaScript的prototype
    记kkpager分页控件的使用
    面试必问的 volatile
    观察者模式——从JDK到Spring
    Java 内存模型都不会,就敢在简历上写熟悉并发编程吗
    工厂模式,就这一篇搞定
    JVM解毒——类加载子系统
    JVM解毒——JVM与Java体系结构
  • 原文地址:https://www.cnblogs.com/sxy-798013203/p/7637298.html
Copyright © 2020-2023  润新知