zoukankan      html  css  js  c++  java
  • 07_指针运算,指针与一维数组

    一 指针与一维数组

    回顾:一维数组

    // 定义且初始化数组
    int arr[5] = { 1, 2, 3, 4, 5 };
    // 遍历打印数组
    for (int i = 0; i < 5; i++)
    cout << arr[i] << " ";

    元素访问:通过 数组名+下标的形式

    数组名是数组首地址

    ==> 能不能通过首地址+下标的形式访问数组元素?
    // 定义int*类型指针p 保存arr首地址
    int* p = arr;
    // 通过指针(首地址)访问数组元素
    for (int i = 0; i < 5; i++)
    cout << p[i] << " ";
    // ==> p保存了首地址所以p和arr效果一样的

    // 使用指针特性 取内容
    for (int i = 0; i < 5; i++)
    cout << *(p + i) << " ";
    // ==> p[i] 和 *(p + i) 是等价的
    // ==> 指针可以进行运算

     

    二 指针加减

    注意:1 指针可以加上或减去一个整数

    2 指针进行加减后,实际上是指针进行了偏移,偏移的范围是加上或减去的整数个单位。

    单位大小:指针指向的类型在内存中所占的字节数
    偏移:指针指向不变,但是根据偏移取别的内容
    改变指向:指针指向变了(指针变量的值发生了改变)

    存储模式

    1 小端模式:低位存低字节(逻辑习惯)从高位向低位读取
    2 大端模式:高位存低字节(阅读习惯)
        // 小指针读取大内容 (读取部分)
    int num = 0XABCD1234;
    int* pn = &num;
    short* p = (short*)pn;
    printf("%X ", *(p + 1));

    // 大指针读取小内容 (读取多个)
    short sh[5] = { 1, 5, 2, 3, 9 };
    short* psh = sh;
    int* p = (int*)psh;
    printf("%X ", *(p + 1));

    三 自增自减(++ --)

    指针自身,加一减一,所以指针本身发生了改变(改变了指向)

        int arr[5] = { 1, 2, 3, 4, 5 };
    int* p = &arr[0];
    cout << " p:" << p << endl; // 地址1
    cout << "*p:" << *p << endl; // 1
    cout << endl;
    p++;
    cout << " p:" << p << endl; // 地址1+4
    cout << "*p:" << *p << endl; // 2
    cout << endl;
    p++;
    cout << " p:" << p << endl; // 地址1+4+4
    cout << "*p:" << *p << endl; // 3
    cout << endl;
        short arr[5] = { 1, 2, 3, 4, 5 };
    short* p = &arr[0];
    cout << " p:" << p << endl; // 地址1
    cout << "*p:" << *p << endl; // 1
    cout << endl;
    p++;
    cout << " p:" << p << endl; // 地址1+2
    cout << "*p:" << *p << endl; // 2
    cout << endl;
    p++;
    cout << " p:" << p << endl; // 地址1+2+2
    cout << "*p:" << *p << endl; // 3
    cout << endl;

    指针自增时,指向改变,

    自增:指向向后改变一个单位

    单位:指针指向的类型的字节数

    同理可得:

    指针自减时,指向改变

    自减:指向向前改变一个单位

    单位:指针指向的类型的字节数

        short* pnull = NULL;
    pnull--;
    cout << pnull << endl; // FFFFFFFE
        int* pnull = NULL;
    pnull--;
    cout << pnull << endl; // FFFFFFFC

     

    综合练习

    要特别注意运算时时指针相加减还是地址值相加减

        int arr[5] = { 1, 2, 3, 4, 5 };
    int* p = &arr[0];
    int* p1 = p++;
    cout << *(p1 + 2) << endl;
    int** pp = &p;
    int* p2 = (int*)((int)(*pp) + 4);
    cout << *p2 << endl;

     

     

  • 相关阅读:
    java开发规范总结_代码编码规范
    java开发规范总结_代码注释规范
    Android简单例子——IpHone样式AlertDialog
    Java的split方法说明
    Android简单例子——AlertDialog
    Android增加监听的三种实现方式
    Android学习笔记(SQLite的简单使用)
    【公告】新博客、新地址,欢迎交换友链
    【公告】博客迁移中,暂停更新...
    【System】Install chromium os in vmware workstation
  • 原文地址:https://www.cnblogs.com/ZhenXin0101/p/13475233.html
Copyright © 2011-2022 走看看