高程 | 数组、指针与字符串(c++)

文章目录

  • 📚数组
    • 🐇数组的概念
    • 🐇数组的声明与使用
    • 🐇数组的存储与初始化
    • 🐇数组作为函数参数
    • 🐇对象数组
  • 📚指针
    • 🐇内存空间的访问方式
    • 🐇指针变量的声明
    • 🐇指针运算
    • 🐇指针的赋值
    • 🐇指向常量的指针
    • 🐇指针类型的常量
    • 🐇用指针处理数组元素
    • 🐇指针数组
    • 🐇用指针作为函数参数
    • 🐇指针类型的函数
    • 🐇指向函数的指针
    • 🐇对象指针
  • 📚动态内存分配
    • 🐇必要性
    • 🐇new和delete
    • 🐇动态创建多维数组
  • 📚用vector创建数组对象
  • 📚深拷贝与浅拷贝
  • 📚字符串

📚数组

🐇数组的概念

  • 数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。
  • 数组属于构造类型。

🐇数组的声明与使用

  • 声明
    在这里插入图片描述
  • 使用
    • 数组元素必须先声明,后使用。
    • 只能逐个引用数组元素,而不能一次引用整个数组。例如:a[0]=a[5]+a[7]-a[2*3]b[1][2]=a[2][3]/2
    • 下标值不得超过声明时所确定的上下界。

🐇数组的存储与初始化

  • 🥕一维数组
    • 一维数组的存储:数组元素在内存中顺次存放,它们的地址是连续的。
      在这里插入图片描述
    • 一维数组的初始化:可以在定义数组的同时赋给初值。
      在这里插入图片描述
  • 🥕二维数组
    • 二维数组的存储
      在这里插入图片描述
    • 二维数组的初始化
      在这里插入图片描述

🐇数组作为函数参数

  • 数组元素作实参,与单个变量一样。
  • 数组名作参数,形、实参数都应是数组名(实质上是地址)。
  • 类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。

🐇对象数组

  • 声明:类名 数组名[元素个数];
  • 访问:数组名[下标].成员名
  • 初始化:数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。
    • 通过初始化列表赋值。例:Point a[2]={Point(1,2),Point(3,4)};
    • 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用缺省构造函数)。
  • 数组元素所属类的构造函数
    • 不声明构造函数,则采用缺省构造函数。
    • 各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
    • 各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
    • 当数组中每一个对象被删除时,系统都要调用一次析构函数。

📚指针

  • C语言指针详解,30分钟玩转C语言指针
  • 【动画教程】C语言指针动画演示

🐇内存空间的访问方式

  • 通过变量名访问
  • 通过地址访问

🐇指针变量的声明

  • 概念
    在这里插入图片描述
    • 指针:内存地址,用于间接访问内存单元。
    • 指针变量:用于存放地址的变量。

🐇指针运算

  • *称为指针运算符,是一个一元操作符,表示指针所指向的对象的值
  • &称为取地址运算符,也是一个一元操作符,是用来得到一个对象的地址
  • 指针变量的运算
    • 指针变量的算术运算
      在这里插入图片描述

      • 这种运算的结果取决于指针指向的数据类型
        在这里插入图片描述
    • 指针变量的关系运算&赋值运算
      在这里插入图片描述

🐇指针的赋值

  • 指针变量的初始化
    在这里插入图片描述
    • 注意事项
      • 用变量地址作为初值时,该变量必须在指针初始化之前已声明过,且变量类型应与指针类型一致。
      • 可以用一个已赋初值的指针去初始化另一个指针变量。
      • 不要用一个内部 auto 变量去初始化 static 指针。@野指针详解
  • 指针变量的赋值运算
    • 指针名 = 地址
      • “地址”中存放的数据类型与指针类型必须相符。
      • 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。
      • 指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned long int型。
      • 允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。例: void *general; ,不能声明void类型的变量。

🐇指向常量的指针

  • 不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
    在这里插入图片描述

🐇指针类型的常量

  • 若声明指针常量,则指针本身的值不能被改变。
    在这里插入图片描述

  • const int * p1 int * const p2区别是什么
    • const int * p1 声明了一个指向整型常量的指针p1,因此不能通过指针p1来改变它所指向的整型值;
    • int * const p2声明了一个指针型常量,用于存放整型变量的地址,这个指针一旦初始化后,就不能被重新赋值了。

  • 定义一个整型变量a,一个整型指针p,一个引用r,通过p把a的值改为10,通过r把a的值改为5
    void main()
    {int a;int *p = &a;int &r = a;*p = 10;r = 5;
    }
    

🐇用指针处理数组元素

  • 声明与赋值
    • int a[10], *pa; pa=&a[0]; pa=a;
    • 经过上述声明及赋值后:
      • pa就是a[0](pa+1)就是a[1],… ,*(pa+i)就是a[i]
      • a[i], *(pa+i), *(a+i), pa[i]都是等效的。
      • 不能写 a++,因为a是数组首地址是常量。

🐇指针数组

  • 数组的元素是指针型
    在这里插入图片描述
  • 指针数组VS二维数组
    在这里插入图片描述
    在这里插入图片描述

🐇用指针作为函数参数

  • 以地址方式传递数据,可以用来返回函数处理结果。
  • 实参是数组名时形参可以是指针。
  • 指向常量的指针做形参(不通过指针改变指针所指向对象的内容)
    #include<iostream>using namespace std;const int N = 6;void print(const int *p, int n);int main() 
    {int array[N]; for (int i = 0; i < N; i++)    cin>>array[i];  print(array, N);  return 0;}void print(const int *p, int n) {  cout << "{ " << *p;  for (int i = 1; i < n; i++)     cout << ", " << *(p+i);  cout << " }" << endl;}
    

🐇指针类型的函数

  • 函数的返回值是地址,该函数就是指针类型的函数。
  • 声明形式:存储类型 数据类型 *函数名()
  • 注意
    • 不要将非静态局部地址用作函数的返回值。
    • 返回的指针要确保在主调函数中是有效、合法的地址。
      • 例1:主函数中定义的数组,在子函数中对该数组元素进行某种操作后,返回其中一个元素的地址,这就是合法有效的地址
      • 例2:在子函数中定义局部变量后将其地址返回给主函数,就是非法地址
      • 例3:在子函数中通过动态内存分配new操作取得的内存地址返回给主函数是合法有效的,但是内存分配和释放不在同一级别,要注意不能忘记释放,避免内存泄漏

🐇指向函数的指针

  • 声明形式:存储类型 数据类型 (*函数指针名)();
  • 函数指针指向的是程序代码存储区。
  • 典型用途——实现函数回调通过函数指针调用函数。
    • 例如将函数的指针作为参数传递给一个函数,使得在处理相似事件的时候可以灵活的使用不同的方法。
    • 调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。与函数名具有相同的作用。

🐇对象指针

  • 声明形式:类名 *对象指针名;
  • 通过指针访问对象成员:对象指针名->成员名ptr->getx()相当于(*ptr).getx();
  • this指针
    • 隐含于每一个类的成员函数中的特殊指针。
    • 明确地指出了成员函数当前所操作的数据所属的对象。
      • 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。
  • C++类和对象的使用之对象指针

📚动态内存分配

  • 动态内存分配 (详解版)

🐇必要性

  • 数组可以对大量的数据和对象进行有效管理,但很多情况下,程序运行之前并不能确切知道数组中元素的个数。
  • 动态内存分配技术:保证程序在运行过程中按实际需要申请适量内存,且在使用结束后进行释放。

🐇new和delete

  • 动态申请内存操作符new
    • new 数据类型T(初始化参数列表)int * point = new int();
    • 功能:在程序执行期间,申请用于存放T类型变量/对象的内存空间,并依初值列表赋以初值。
    • 结果值:
      • 成功:T类型的指针,指向新分配的内存;
      • 失败:抛出异常。
  • 释放内存操作符delete
    • delete 指针p
    • 功能:释放指针p所指向的内存。p必须是new操作的返回值。
    • 注意:New分配的内存必须用delete加以释放。

🐇动态创建多维数组

  • new 类型名T[第1维长度][第2维长度]…;
  • 如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。
    在这里插入图片描述

📚用vector创建数组对象

  • 使用vector创建数组对象
  • 为什么需要vector?
    • 将动态数组封装,自动创建和删除数组下标越界检查
  • vector动态数组对象的定义
    • vector<元素类型> 数组对象名(数组长度);
    • 例:vector<int> arr(5),​建立大小为5的int数组
  • 对数组元素的引用
    • 与普通数组具有相同形式:数组对象名 [ 下标表达式 ]
    • 但vector数组对象名不表示数组首地址
  • 获得数组长度
    • 用size函数
    • 数组对象名.size()

📚深拷贝与浅拷贝

  • 浅拷贝:实现对象间数据元素的一一对应复制。
  • 深拷贝:当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指对象进行复制。

📚字符串

  • C++中的String的常用函数用法总结
    在这里插入图片描述

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

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

相关文章

蓝桥杯嵌入式第10届真题(完成) STM32G431

蓝桥杯嵌入式第10届真题(完成) STM32G431 题目 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body********************************…

【C语言】指针练习篇(下),深入理解指针---指针练习题【图文讲解,详细解答】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】指针练习篇&#xff08;下&#xff09;&#xff0c;深入理解指针---指针练习题【图文讲解,详细解答】&#xff0c;图文讲解指针练习题&#xff0c;带大家更深刻理解指针的应用&#xff0c;感谢观看&#xff0c;支持的可以…

文件操作详解

文章目录 目录1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭 4. 文件的顺序读写5. 通讯录的改造6. 文件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. 文本文件和二进制文件8. 文件读取结束的判定9. 文…

『运维备忘录』之 Lsof 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

Excel模板2:进度条甘特图

Excel模板2&#xff1a;进度条甘特图 ‍ 今天复刻B站up【名字叫麦兜的狗狗】的甘特图&#xff1a;还在买Excel模板吗&#xff1f;自己做漂亮简洁的甘特图吧&#xff01;_哔哩哔哩_bilibili 阿里网盘永久分享&#xff1a;https://www.alipan.com/s/cXhq1PNJfdm 当前效果&…

《剑指offer》--字符串左旋【超详细建议收藏】

字符串左旋的三种方法 1. 一个一个字符挪2. 库函数---strcpy和strncat3. 三段逆置法 1. 一个一个字符挪 代码实现如下&#xff1a; #include <stdio.h> #include <string.h>void Left_Reverse(char* str,int k) {int len strlen(str);//6int time 0;time k % …

react【六】 React-Router 路由

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…

几个经典金融理论

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 一、预期效用理论 预期效用理论是描述人们在做出决策时如何考虑风险和不确定性的一种理论。该理论最初由经济学家冯诺伊曼&#xff08;John von Neumann&#xff09;和奥斯卡摩根斯坦恩&#xff08;Oskar…

全栈笔记_工具篇(nvm免安装版配置)

免安装版配置 下载nvm包:选择免安装压缩包nvm-noinstall.zip 解压zip包:将压缩包解压到指定目录,如:C:\nvm 新增环境变量: NVM_HOME:nvm解压之后的文件路径,对应配置文件里的root值NVM_SYMLINK:nvm 文件夹里新建 nodejs文件夹,对应配置文件里的path值 修改环境变量Pat…

数解 transformer 之 self attention transformer 公式整理

千万不要从任何角度轻看 transformer&#xff0c;重要的话说四遍&#xff1a; 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer Attention is all you need 整个项目是鬼斧神工之作&#xff0c;巧夺天工之作&a…

Spring 用法学习总结(三)之 AOP

Spring学习 7 bean的生命周期8 AOP面向切面编程8.1 AOP相关术语8.2 AOP使用 7 bean的生命周期 bean的生命周期主要为bean实例化、bean属性赋值、bean初始化、销毁bean&#xff0c;其中在实例化和初始化前后都使用后置处理器方法&#xff0c;而InstantiationAwareBeanPostProce…

控制论与科学方法论

《控制论与科学方法论》&#xff0c;真心不错。 书籍原文电子版PDF&#xff1a;https://pan.quark.cn/s/00aa929e4433&#xff08;分类在学习目录下&#xff09; 备用链接&#xff1a;https://pan.xunlei.com/s/VNgj2vjW-Hf_543R2K8kbaifA1?pwd2sap# 控制论是一种让系统按照我…

CTF-web 之 burp suite 使用

burp suite 使用 一般其是作为一个辅助工具&#xff0c;直接使用来解题的部分是少数&#xff0c;我们可以使用它来观察请 求和响应&#xff0c;并且可以反复的提交&#xff0c;关键的是他还带有很多其他的功能&#xff0c;在我们做题的过程中&#xff0c; 使用的关键点包括&…

MyBatis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 MyBatis 的接口绑定?有哪些实现方式?二、使用 MyBatis 的 mapper 接口调用时有哪些要求?三、Mapper 编写有哪几种方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…

书生浦语大模型实战营-课程笔记(2)

介绍了一下InternLm的总体情况。 InternLm是训练框架&#xff0c;Lagent是智能体框架。 这个预训练需要这么多算力&#xff0c;大模型确实花钱。 Lagent是智能体框架&#xff0c;相当于LLM的应用。 pip设置 开发机的配置 pip install transformers4.33.1 timm0.4.12 sente…

vue项目搭建测试

5&#xff0c;项目测试 导入elementplus以及样式 import ElementPlus from element-plus import element-plus/dist/index.csscreateApp(App).use(store).use(router).use(ElementPlus).mount(#app)<template><el-row class"mb-4"><el-button>De…

MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)

目录 主要内容 模型研究 1.改进二进制粒子群算法&#xff08;BPSO&#xff09; 2.模型分析 结果一览 下载链接 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》&#xff0c;主要做的是一个考虑需求响应的机组组合…

投资银行在网络安全生态中的作用

文章目录 一、投资银行的含义(一)并购买方。(二)并购卖方。(三)IPO辅助。(四)投资银行业务的另一方面是帮助这些交易融资。二、从投资银行角度看网络安全产业(一)行业的短期前景三、复杂的网络安全并购(一)行业知识对投资银行业务很重要(二)在网络安全领域,技术…