C/C++基础----数组和引入指针

数组

数组的定义

  • 语法:

    类型 变量名[数组大小] = {数组内容1,数组内容2};
    int array[5] = {1,2,3,4,5};
    
  • 代码

    int main(){// 定义数组,大小不写,数组内默认有多少元素大小就为多少int array_a[] = {1, 2, 3, 4, 5, 6};// 定义数组长度为5,存放了5个元素int array_b[5] = {1, 2, 3, 4, 5};return 0;
    }
    

数组的循环

第一种for循环
  • 使用sizeof获取的数组大小为内存中的大小,int占4个字节,6个int占24个字节
  • 求数组元素中的个数:sizeof(数组) / sizeof(数组内的元素类型)
    #include <iostream>using namespace std;int main() {int array_a[] = {1, 2, 3, 4, 5, 6};cout << "数组的大小:" << sizeof(array_a) << endl;cout << "数组中元素的个数:" << sizeof(array_a) / sizeof(int) << endl;int array_length = sizeof(array_a) / sizeof(int);for (int i = 0; i < array_length; i++) {cout << array_a[i] << endl;}return 0;
    }
    在这里插入图片描述
第二种for循环
  • 语法

    for (数组中元素类型 临时变量: 数组){// 操作的代码i为每次遍历元组中的元素
    }
    
  • 代码

    #include <iostream>using namespace std;int main() {int array_a[] = {1, 2, 3, 4, 5, 6};for (int i: array_a) {cout << i << endl;}return 0;
    }

    在这里插入图片描述


包装数组

使用包装数组的原因:
  • 使用包装数组是因为我们原生的数组不能动态的往数组添加元素,甚至数组的长度还需要我们来计算得出

  • 原生数组下标越界后不报错,这导致我们程序写错时也不容易找出错误在哪

  • 包装数组的意思就是非c++原生的数组,而是在原数组之上增加了其他方法和操作的功能的包装的数组

  • 原生数组下标越界展示:

    int array[] = {1, 2, 3, 4};
    cout << array[4] << endl;
    

    在这里插入图片描述

  • 根据上面结果看出下标越界并不报错,而是打印出来一些…怪异的东西

std::array
  • 语法:

    • 需要导入#include <array>
    • array.size() 返回数组长度
    • array.at(下标) 返回该下标元素,下标越界会报错
    #include <array>
    std::array<数组中元素的类型,数组的长度> 数组变量名 = {元素1,元素2...};
    // 返回数组的长度
    数组变量名.size() 
    // 根据下标取值
    数组变量名.at(下标)
    
  • 代码:

    #include <iostream>
    #include <array>using namespace std;int main() {array<int, 5> array_a = {1, 2, 3, 4, 5};// 数组的长度cout << "array_a的长度为:" << array_a.size() << endl;// 遍历打印for (int i = 0; i < array_a.size(); i++) {cout << array_a.at(i) << endl;}return 0;
    }

    在这里插入图片描述

  • std::array使用at()方法获取元素下标越界

    • 直接抛出异常
    • tips: 使用std::arrayarray[下标]取值的方式还是会出现和原生数组一样的情况
    #include <iostream>
    #include <array>using namespace std;int main() {array<int, 5> array_a = {1, 2, 3, 4, 5};// 数组的长度cout << "array_a的长度为:" << array_a.size() << endl;cout << "第五个个元素" << array_a.at(5) << endl;return 0;
    }
    

    在这里插入图片描述

std::vector
  • 语法:
    #include <vector>
    // 任意元素个数
    std::vector<数组中元素的类型> 数组变量名 = {元素1,元素2...};
    // 指定元素个数
    std::vector<数组中元素的类型> 数组变量名(指定的元素个数);
    // 返回数组的长度
    数组变量名.size() 
    // 根据下标取值
    数组变量名.at(下标)
    
  • 代码:
    #include <iostream>
    #include <vector>using namespace std;int main() {vector<int> array_a = {1, 2, 3, 4, 5};for (int i = 0; i < array_a.size(); i++) {cout << array_a.at(i) << endl;}return 0;
    }
    
  • vector的其他一些方法:
方法名 作用
push_back(要添加的值) 在数组的末尾添加一个元素
at(下标) 访问数组中该下标的元素
size() 返回数组的长度
clear() 清空数组中的元素
pop_back() 删除数组中末尾的一个值(没有返回值)
erase(迭代器指针 + 要删除的下标下的元素); 删除数组中指定下标的元素
  • 示例:
    #include <iostream>
    #include <vector>using namespace std;int main() {vector<int> array_a = {1, 2, 3, 4, 5};cout << "当前数组元素:";for (int &i: array_a) {cout << i;}cout << endl;cout << "数组中在最后面添加了一个6!!" << endl;array_a.push_back(6);cout << "当前数组元素:";for (int &i: array_a) {cout << i;}cout << endl;cout << "数组取下标为0的值:" << array_a.at(0) << endl;cout << "数组取下标为1的值:" << array_a.at(1) << endl;cout << "当前数组的长度:" << array_a.size() << endl;cout << "数组中在最后删除了一个元素!!" << endl;array_a.pop_back();cout << "当前数组元素:";for (int &i: array_a) {cout << i;}cout << endl;cout << "数组中在下标为1的位置删除了一个元素!!" << endl;array_a.erase(array_a.begin() + 1);cout << "当前数组元素:";for (int &i: array_a) {cout << i;}cout << endl;// 迭代器打印for (auto i = array_a.begin(); i != array_a.end(); i++) {cout << *i << endl;}cout << "清空了数组!!" << endl;array_a.clear();cout << "当前数组长度:" << array_a.size() << endl;return 0;
    }
    
    在这里插入图片描述
std:array和std::vector的区别
  • 相同点:
    • at方法根据下标取值取不到都会抛出异常,使用下标取值都和原生数组一样
    • at()、size()方法用法一样
  • 不同点
    • vector可以动态添加或删除数组中的值;array数组是固定的值,不能修改。
    • vector的每个元素的内存不是连续的,是动态分配的地址,而array和原生数组一样内的元素内存地址是连续的。这也就决定了vector会比原生和array的数组操作起来更耗时。
    • vector可以使用迭代器来循环

多维数组(数组嵌套)

  • 语法:

    数组中元素的类型 数组变量名[第一层数组中的元素个数][第二层数组中的元素个数] = {{元素1,元素2},{元素1,元素2}
    }
    
  • 使用两次for循环来打印出数组中的每个元素

    #include <iostream>using namespace std;int main() {int array_a[2][2] = {{1, 2},{2, 4}};// 循环两次for (int i = 0; i < 2; i++) {// 每次循环再循环两次for (int j = 0; j < 2; j++) {// 数组[第一层的下标][第二层的下标]取出数据cout << array_a[i][j] << endl;}}return 0;
    }
    
第二种for循环遍历二维数组(引入指针)
  • 代码:

    • auto类型为自动识别类型
    #include <iostream>using namespace std;int main() {int array_a[2][2] = {{1, 2},{3, 4}};for (auto &i: array_a) {for (int j: i) {cout << j << endl;}}
    }
    

    在这里插入图片描述


引入指针

  • 其实c++中就是在操作内存,直接打印数组就是打印程序在运行时该数组在电脑中的内存地址。

    int array_a[2][2] = {{1, 2},{3, 4}};
    cout << array_a << endl;
    

    在这里插入图片描述

  • 所有的变量在内存中都有地址

    • 使用&变量名取出变量的内存地址
    • 把内存地址赋值给 类型 * 变量名的一个变量
    • 这个变量被称为指针类型
    • 变量取出来的地址,该变量是什么类型指针就要是什么类型
    • 例如char a = 'a;' 那么char* p_a = &a;
    int a = 10;
    int *p_a = &a;
    cout << &a << endl;
    cout << p_a << endl;
    

    在这里插入图片描述

  • 所以之前二维数组打印时,第一层取出的i前面要加个&,因为要取出地址来,供下一层操作

  • 所以到这里我们也明白了,为什么之前原生数组用下标取值,越界不报错,取出了奇奇怪怪的值,是因为内存地址是连续的,取到了电脑中下一个内存中的值,这个值我们谁也无法确定。

    • 打印示例:
      在这里插入图片描述
      在这里插入图片描述

    • 根据两次打印我们可以看出,内存地址是连续的,下标越界确实值不可预知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础知识-第10章-计算机网络概论

一、什么是计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 要注意不…

jenkins+sonar配置

安装插件 Sonar Scanner 用于扫描项目 配置sonar scanner jenkins集成sonar 1、sonar生成token 生成完保存好&#xff0c;刷新后无法查看 2、jenkins配置全局凭据 3、jenkins配置系统设置

2、ESP-WROOM-32开发板笔记

ESP32 是乐鑫开发的一系列低成本、低功耗的片上系统微控制器&#xff0c;具有 Wi-Fi 和蓝牙无线功能以及双核处理器。 目录 一、特点 二、硬件内存 三、支持外设 四、引脚定义 1、仅输入引脚 2、SPI闪存 3、电容式触摸 IO 4、ADC 5、DAC 6、RTC GPIO 7、PWM 8、I2C 9、SPI …

时间复杂度详解2——时间复杂度的计算

时间复杂度基本计算规则&#xff1a; 基本操作即只有常数项&#xff0c;认为其时间复杂度为O(1)顺序结构&#xff0c;时间复杂度按加法进行计算循环结构&#xff0c;时间复杂度按乘法进行计算分支结构&#xff0c;时间复杂度取最大值判断一个算法效率时&#xff0c;往往只需要…

第十二届蓝桥杯大赛软件赛省赛Java 大学 B 组题解

1、ASC public class Main {public static void main(String[] args) {System.out.println(

LeetCode- 合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…

Java | Leetcode Java题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; class Solution {public List<String> letterCombinations(String digits) {List<String> combinations new ArrayList<String>();if (digits.length() 0) {return combinations;}Map<Character, String> phoneM…

Linux的学习之路:7、yum与git

摘要 本章主要是说一下yum和git的操作 目录 摘要 一、什么是yum 二、yum三板斧 1、list 2、install 3、remove 三、怎么创建仓库 四、git三板斧 1、add 2、commit 3、push 4、pull 五、思维导图 一、什么是yum YUM是Yellowdog Updater Modified的简称&#xf…

Github 2024-04-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6TypeScript项目2Cuda项目1C++项目1C项目1HTML项目1Jupyter Notebook项目1JavaScript项目1Python - 100天从新手到大师 创建周期:22…

unity_Button:单击的三种实现方式

1.针对特定单个按钮 此代码直接绑定到button上面无需其他操作 using UnityEngine; using UnityEngine.UI;public class PrintHelloOnButtonClick : MonoBehaviour {private Button button;void Start(){// 获取当前GameObject上的Button组件button GetComponent<Button&g…

CTF-SHOW SSRF

web351 存在一个flag.php页面&#xff0c;访问会返回不是本地用户的消息&#xff0c;那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议&#xff0c;之后判断我们传入的url中是否含有localhost和127.0.0&#xff0c;如果没有则…

VulnHub靶机-easy_cloudantivirus 打靶

easy_cloudantivirus 靶机 目录 easy_cloudantivirus 靶机一、导入虚拟机配置二、攻击方式主机发现端口扫描web渗透-SQL注入命令注入反弹shellssh爆破提权 一、导入虚拟机配置 靶机地址&#xff1a; https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/下载完成&am…

Docker 安装RabbitMQ以及使用客户端图形化界面

目录 一、点击进入docker 镜像仓库 1.1 直接在官网里 搜索 rabbitmq 1.2 在标签里 直接搜索3.10-management 因为这个标签包含用户操作界面 二、启动docker 2.1 首先拉取镜像&#xff1a; 2.2 Docker运行&#xff0c;并设置开机自启动 三、访问用户操作界面 一、点击进入…

PTA(题目集二 题目 代码 C++)

目录 题目一&#xff1a; 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码&#xff1a; 题目七&#xff1a; 代…

python中time库的time.time()函数的作用是什么?

python中time库的time.time()函数的作用是什么&#xff1f; 作用&#xff1a;Python time time() 返回当前时间的时间戳&#xff08;1970纪元后经过的浮点秒数&#xff09;。 time()方法语法&#xff1a;time.time() #!/usr/bin/python # Write Python 3 code in this onlin…

Windows10 19c单例数据库补丁升级方案

一、环境说明&#xff1a; 名称内容系统版本Windows10数据库版本19.3.0.0.0SIDorcl 二、配置OPatch 2.1.解压OPatch --解压至$ORACLE_HOME位置 2.2.查看版本 --命令 OPatch version 三、准备打补丁 3.1.解压补丁文件 --解压 unzip p35962832_190000_MSWIN-x86-64.zip 3.2.…

【DM8】AWR报告

sys.WRM$_WR_CONTROL记录快照的相关控制信息 sys.wrm $_snapshot记录快照的相关信息 1.初始化awr快照包 创建或删除DBMS_WORKLOAD_REPOSTORY系统包为1的时候开启&#xff0c;0的时候关闭 SELECT sf_check_awr_sys; sp_init_awr_sys(1);2.设置时间 –间隔10min一次 CALL dbms_…

未来汽车硬件安全的需求(1)

目录 1.概述 2.EVITA 2.1 EVITA HSM 2.2 EVITA保护范围 3.市场变化对车载网络安全的影响 3.1 非侵入式攻击的风险 3.2 量子计算机的蛮力攻击 3.3 整车E/E架构的变化 3.4 网络安全标准和认证 3.5 汽车工业的网络安全措施 4.汽车安全控制器 4.1 TPM2.0 4.2 安全控…

CLIP模型入门

简介 CLIP&#xff08;Contrastive Language-Image Pre-Training&#xff09;是OpenAI在2021年初发布的多模态预训练神经网络模型&#xff0c;用于匹配图像和文本。该模型的关键创新之一是将图像和文本映射到统一的向量空间&#xff0c;通过对比学习的方式进行预训练&#xff…

运用OSI模型提升排错能力

1. OSI模型有什么实际的应用价值&#xff1f; 2. 二层和三层网络的区别和应用&#xff1b; 3. 如何通过OSI模型提升组网排错能力&#xff1f; -- OSI - 开放式系统互联 - 一个互联标准 - 从软件和硬件 定义标准 - 不同厂商的设备 研发的技术 - 具备兼容性 -- O…