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,一经查实,立即删除!

相关文章

多线程小问题

多线程小问题 一:简述 wait 和 sleep 有什么区别&#xff1f;二:请说明Thread类中run和start的区别 一:简述 wait 和 sleep 有什么区别&#xff1f; 共同点&#xff1a; 都是使线程暂停一段时间的方法。 不同点&#xff1a; wait是Object类中的一个方法&#xff0c;sleep是Thr…

浅谈数据结构

1.前言 数据结构&#xff0c;就是一种程序设计优化的方法论&#xff0c;研究数据的逻辑结构和物理结构以及他们之间的关系&#xff0c;并对这种结构定义相应的运算&#xff0c;目的是加快程序的执行速度&#xff0c;减少占用的内存空间. 2.研究对象1--数据间的逻辑关系 数据…

蓝桥集训之三国游戏

蓝桥集训之三国游戏 核心思想&#xff1a;贪心 将每个事件的贡献值求出 降序排序从大到小求和为正是即可 #include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N 100010;int a[N],b[N],c[N];…

【资料】华为硬件工程师手册与资料

资料目录&#xff1a; 华为硬件开发手册&#xff1a;1-159 华为数字电路&#xff1a;160-510 华为模拟电路&#xff1a;511-709 华为单板设计审查表&#xff1a;710-723 华为EMC资料&#xff1a;724-817 眼图知识简介&#xff1a;818-830 硬件工程师课程视频 硬件学习笔…

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

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

Vue开发注意事项

后端返回的Long型数据太长&#xff08;比如身份证号&#xff09;&#xff0c;部分数据可能被前端变为0 解决方法&#xff1a;Long变为String 使用delete发送请求时&#xff0c;用 ?参数值&参数值 的形式 export const deletepatient (id) > {// console.log(id)//返…

jenkins+sonar配置

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

商业智能-BI

商业智能&#xff08; Business Intelligence &#xff0c; BI &#xff09;是企业对商业数据的搜集、管理和分析的系统过 程&#xff0c;目的是使企业的各级决策者获得知识或洞察力&#xff0c;帮助他们做出对企业更有利的决策。 商业智能技术并不是基础技术或者产品技术&a…

pytorch 查看 GPU 型号

import torch# 检查CUDA是否可用 if torch.cuda.is_available():print("CUDA is available!")# 还可以获取CUDA设备的数量device_count torch.cuda.device_count()print(f"Number of CUDA devices: {device_count}")# 获取第一块GPU的信息device torch.d…

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…

芒果YOLOv5改进94:检测头篇DynamicHead为目标检测统一检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知

该专栏完整目录链接: 芒果YOLOv5深度改进教程 该创新点:在原始的Dynamic Head的基础上,对核心部位进行了二次的改进,在 原论文 《尺度感知、空间感知、任务感知》 的基础上,在 通道感知 的层级上进行了增强,关注每个像素点的比重。 在自己的数据集上改进,有效涨点就可以…

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…