高程 | 数组、指针与字符串(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 当前效果&…

CGAL::2D Arrangements-7

7 几何Traits 几何Traits封装了几何实体的定义以及处理这些几何实体的几何predicates和构造的实现&#xff0c;由Arrangement_on_surface_2类模板和其他周边模块使用。应用于Arrangement的各种算法所确定的最小要求被组织在精细几何特征概念的层次中。每个概念列出的需求只包括…

python_numpy库_ndarray的聚合操作、矩阵操作等

一、ndarray的聚合操作 1、求和np.sum() import numpy as np ​ n np.arange(10) print(n) ​ s np.sum(n) print(s) ​ n np.random.randint(0,10,size(3,5)) print(n) s1 np.sum(n) print(s1) #全部数加起来 s2 np.sum(n,axis0) print(s2) #表示每一列的多行求和 …

《剑指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.…

「Python」Selenium

基本使用 导入&#xff1a;from selenium import webdriver创建浏览器操作对象&#xff1a;browser webdriver.Chrome()访问网站 # 访问网站 url https://www.jd.com browser.get(url)""" selenium基本使用Author&#xff1a;binxin Date&#xff1a;2023/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…

Redis核心技术与实战【学习笔记】 - 29.Redis的未来猜想,基于 NVM内存

前言 这几年&#xff0c;新型非易失存储&#xff08;Non-Volatile Memory&#xff0c;NVM&#xff09;器件发展得非常快。NVM 器件具有容量大、性能快、能持久报错数据的特性&#xff0c;这些刚刚就是 Redis 追求的目标。同时 NVM 器件像 DRAM 一样&#xff0c;可以让软件以字…

几个经典金融理论

完整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…

跨域问题浅析

什么是源(域) 在W3C的定义中,源是由协议、主机(IP 地址或者域名)和端口三者确定。如果两个 URL 的协议、主机(IP 地址或者域名)和端口都一样的话,那么这两个 URL 就是同源的。 同源策略 由于源与源之间是未知且默认的,所以非本源中的资源(即URL对应的资源)是不可控的…

数解 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…

2024大健康展,山东省大健康产业博览会,济南营养健康展会

立足济南&#xff0c;面向世界&#xff0c;2024第六届中国国际大健康产业博览会&#xff0c;定档2024年5月27-29日&#xff0c;在济南黄河国际会展中心举办&#xff1b; 2024第6届中国&#xff08;济南&#xff09;国际大健康产业博览会&#xff08;China-DJK山东健博会&#…

控制论与科学方法论

《控制论与科学方法论》&#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; 使用的关键点包括&…