c++数组相关问题

今天做了leetcode Z型变换的问题,用的是二维字符数组。虽然看到题解后发现原来有更简单的方法,但还是在这里复习一下c++数组的知识
先附上题目连接
leetcode Z型字符变换

一维数组

#include <iostream>
using namespace std;
int main()
{
    /**为了方便 数组的类型全部都是int类型的*/
    int numbers[5] = {1,2,3,4,5};
    /**通过指针的方式访问数组*/
    int * p = numbers;
    cout << "普通指针的方式访问:\n";
    for (int i = 0; i < 5; i++)
        cout << p[i] << " ";
    cout << endl;
    /**
    在这里面numbers 被解释为数组的第一个元素的地址 即 &numbers[0] 而且还是一个常量
    也有特殊的情况,例如:sizeof numbers是数组大小
    */
    cout << "数组大小:";
    cout << sizeof numbers << " Byte.\n";// 5 * 4
    /**通过数组指针的方式访问数组
    数组的地址是 &numbers NOTE:这和numbers值是一样的!!!
    也就是说相同的地址 你可以用普通的指针指向 也可以用数组指针指向
    区别就在于他们的指针运算
    */
    int (*p2)[5] = &numbers;//把数组的numbers替换成(*p2)就是 数组的指针了
    cout << "指针数组的方式访问:\n";
    for (int i = 0; i < 5; i++)
        cout << (*p2)[i] << " ";
    cout << endl;
    /**
    int * p 和 int (*p2)[5] 的区别
    区别在于他们的指针运算
    这里不明白的去百度 指针运算
    */
    cout << "p = " << p << endl;
    cout << "p + 1 = " << p + 1 << endl;//4Byte
    cout << "p2 = " << p2 << endl;
    cout << "p2 + 1 = " << p2 + 1 << endl;//20 Byte
    /**提到 数组指针 就必去提到另一个知识点 指针数组
    数组指针 是 指针
    指针数组 是 数组
    定义的时候 二者通常会混淆
    */
    int * p3[5];//指针数组 每一个元素 都是指针
    for (int i = 0; i < 5; i++)
        p3[i] = (*p2) + i;//p2是数组指针 常作为二维数组的指针使用
    cout << "我也不知道这是什么操作:\n";
    for (int i = 0; i < 5; i++)
        cout << *p3[i] << " ";
    cout << endl;
    return 0;
}

输出结果:
一维数组输出结果

二维数组

#include <iostream>
using namespace std;
int main()
{
    int data[3][5] =
    {
        {1,2,3,4,5},
        {9,8,7,6,5},
        {1,9,9,5,1}
    };
    /**二维数组的本质是 数组的数组、
    第一维数组是3个一维数组的地址、第二维就是普通的数组*/
    int * p[3] = {data[0], data[1], data[2]};
    cout << "地址:\n";
    for (int i = 0; i < 3; i++)
        cout << p[i] << "   ";
    cout << endl;
    /**常规方式访问二维数组*/
    cout << "常规方式访问二维数组\n";
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j <5; j++)
            cout << data[i][j] << " ";
        cout << endl;
    }cout << endl;
    /**用指针数组尝试访问一下*/
    cout << "用指针数组皮一下\n";
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
            cout << p[i][j] << " ";//这里之所以能访问是因为size是int
        cout << endl;
    }cout << endl;
    /**用数组指针
    int data[3][5] 的第一个元素就是data[0]那么他的 地址就是&data[0] 等价于data
    前面说过data是属于的第一个元素的地址, 而且还是一个常量
    那么问题来了 指向&data[0]的指针是什么样子的?
    data[0] 的类型是int[5] 那么
    &data[0] 的类型就是 int (*)[5]
    */
    int (*p2)[5] = data;
    cout << "用数组指针访问\n";
    for (int i = 0 ; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
            cout << p2[i][j] << " ";//这里参考一维数组的数组指针就能理解了
        cout << endl;
    }cout << endl;
    return 0;
}

输出结果
二维数组输出结果

创建动态二维数组

    //申请空间
    int** a2 = new int*[rows];
    for(int i=0;i<rows;i++)
        a2[i] = new int[columns];
    //释放空间
    for(int i=0;i<rows;i++)
        delete []a2[i];
    delete []a2;

用vector创建二维数组

    vector<vector<int> > a3(rows,vector<int>(columns));
    for(int i=0;i<rows;i++){//初始化
         for(int j=0;j<columns;j++){
            a3[i][j] = a1[i][j];
         }
    }

数组与函数

#include <iostream>
using namespace std;
void print1(const int * p, int len);
void print2(const int p[], int len);
void print3(int p[][5], int len);//don't use const  DON'T!!!
void print4(int (*p)[5], int len);//don't use const  DON'T!!!
int main()
{
    int numbers[5] = {1,2,3,4,5};
    int data[3][5] =
    {
        {1,2,3,4,5},
        {5,6,7,8,9},
        {9,8,7,6,5}
    };
    print1(numbers, 5);
    print2(numbers, 5);
    print3(data, 3);
    print4(data, 3);
    return 0;
}
void print1(const int* p, int len)
{
    cout << "print1\n";
    for (int i = 0; i < len; i++)
        cout << p[i] << " ";
    cout << endl;
}
void print2(const int p[], int len)
{
    cout << "print2\n";
    for (int i = 0; i < len; i++)
        cout << *(p + i) << ' ';
    cout << endl;
}
void print3(int p[][5], int len)
{
    cout << "print3\n";
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < 5; j++)
            cout << p[i][j] << ' ';
        cout << endl;
    }cout << endl;
}
void print4(int(* p)[5], int len)
{
    cout << "print4\n";
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < 5; j++)
            cout << p[i][j] << ' ';
        cout << endl;
    }cout << endl;
}
/**
[]([0]) 和 * 是相同的
* 就是[0]
p[5] 可以写成 * (p + 5)
p[5]实际做的事情就是先寻址然后在取值的过程
谭浩强老师在他的书里面讲过
*/

输出结果
在这里插入图片描述

补充


#include <iostream>
using namespace std;
int main()
{
    /**
    const int * p 和 int * const p的区别
    */
    int a = 10;
    const int b = 20;
    const int * p1;// *p1 is read-only
    p1 = &a;
    cout << "p1 = " << p1 << endl;
    cout << "&a = " << &a << endl;
    cout << "*p1 = " << *p1 << endl;
    //ERROR   *p1 = 23;
    p1 = &b;// p1 is not read-only
    cout << "p1 = &b\n";
    cout << "*p1 = " << *p1 << endl << endl;

    int * const p2 = &a;// p2 is read-only and must init it
    //int * const p2 = &b;不匹配 因为没有保护数据
    //const int * const p2 = &b; 这样可以
    cout << "p2 = " << p2 << endl;
    cout << "*p2 = " << *p2 << endl;
    int c = 1222;
//    p2 = &c; erro p2 is read-only
    *p2 = 1234567;
    cout << "*p2 = " << *p2 << endl;
    cout << "p2 = " << p2 << endl;
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值