zoukankan      html  css  js  c++  java
  • 二维数组和指针

    1. 指针是变量的地址

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int a = 3;
        int * p = &a;
    
        cout << a << endl;  // 3
        cout << *p << endl;  // 3
    
        return 0;
    }
    

    如上面这段程序所示,通过取地址符 &,指针 p 获得了变量 a 的地址,那么解引用符 * 就可以从 p 中得到变量 a 的值。

    也就是说,p=&a*p=a 是等价的。p 是变量 a 的地址,从 p 中就可以取出 a 的值。反之,能从 p 中取出 a 的值,p 也就是变量 a 的地址。

    2. 一维数组的数组名是数组的首地址

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        // 一维数组的数组名就是数组的首地址
        int data[3] = {1, 2, 3};
    
        int *p1 = data;
        cout << p1[1] << endl;      // 2
        cout << *(p1+1) << endl;    // 2
    
        int *p2 = &data[0];
    
        cout << p2[1] << endl;      // 2
        cout << *(p2+1) << endl;    // 2
    
        return 0;
    }
    

    一维数组的数组名是数组的首地址,所以 int *p1 = data; 让指针 p1 也指向了数组首地址。这时候 *p1 是数组的第一个元素,*(p1+1) 也即是数组的第二个元素。

    又因为 *p1 是数组的第一个元素,说明 p1 是数组第一个元素的地址,所以 int *p2 = &data[0]; 与上面等效。

    3. 二维数组是数组的数组,其数组名是外层数组的首地址

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    
        // 行指针
        //int (*p)[3] = &data[0];
        int (*p)[3] = data;
    
        cout << p[1][2] << endl; // 6
        cout << (*(p+1))[2] << endl; // 6
        cout << *(p[1] + 2) << endl; // 6
        cout << *(*(p+1)+2) << endl; // 6
    
        return 0;
    }
    

    data[3][3] 相当于是数组 data[data[0], data[1], data[2]],data[0], data[1], data[2] 都是有 3 个元素的一维数组,而 data 则是有 3 个这样数组的一维数组。

    int (*p)[3] 表示行指针 p 指向一个有三个元素的数组,也就是指向外层数组的首地址,而 data&data[0] 是等价的。第一次解引用得到它指向的数组,第二次解引用才得到数组中的值。

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
        int data[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    
        // 列指针
        //int *p = *data;
        //int *p = data[0];
        int *p = &data[0][0];
    
        cout << p[1 * 3 + 2] << endl;
        cout << *(p + 1 * 3 + 2) << endl;
    
        return 0;
    }
    

    列指针是将二维数组展开成一维数组看待,所以列指针指向二维数组的第一个元素。&data[0][0]data[0]*data 三者都代表第一个元素的地址,访问元素需要一次解引用,[]* 等价。

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    IOS开发教程--怎样使用点9图片
    Android studio 自己主动排版
    17 facade
    递归算法时间复杂度分析与改善
    __FUNCTION__, __LINE__ 有助于debug的宏定义
    表名在数据库中的存储大写和小写略解
    七夕节不撸代码你好意思说自己是程序员
    前端开发面试题收集(js部分)
    总体架构
    立即执行的匿名函数
  • 原文地址:https://www.cnblogs.com/seniusen/p/10906558.html
Copyright © 2011-2022 走看看