1、数组

1.1 基本数组

  1. 数组声明int a[10];

    1. 声明时方括号内是元素个数。下标从0开始。
    2. 第一个元素是a[0],最后一个元素是a[9]
    3. a[n]表示的是第n+1个元素
  2. 二维数组int b[3][4];
  3. 数组可以为任何类型,但不能为void类型
  4. 数组名是一个指针常量
  5. 存储
    • 数组元素在内存中是顺序连续存储的
    • 行优先存储
  6. 初始化
    • 一维数组初始化

      int arr[3];          //声明数组,未初始化,无法访问
      int arr[3]; //在文件作用域声明数组,默认初始化为0
      static int arr[3]; //静态数组,默认初始化为0
      int arr[3]={1,2,3}; //给长度,给完整元素
      int arr[]={1,2,3}; //不给长度,给完整元素
      int arr[10]={1,2,3}; //给长度,给部分元素,则缺省元素值为0
      int arr[10]={}; //初始化一个数组,其中元素值均为0
    • 二维数组初始化

      //1、给大小,给完整元素值。以下写法等价
      int arr[2][3]={1,2,3,4,5,6};
      int arr[2][3]={{1,2,3},{4,5,6}};
      int arr[][3]={{1,2,3},{4,5,6}};//第一个大小能省,第二个大小不能省
  7. 数组作为函数参数,传递的是地址
    • //不加const,说明arr是个指针变量
      void test_arr(int arr[5])
      {//函数体内无法通过sizeof(arr)获取传入数组的真实大小,方括号里写了大小也没用
      }
      void test_arr(int arr[])
      {//函数体内无法通过sizeof(arr)获取传入数组的真实大小
      }
      void test_arr(int *arr)
      {//函数体内无法通过sizeof(arr)获取传入数组的真实大小
      }
      //加const,说明arr是个常量指针,表示无法在函数体内通过arr修改数组中元素的值
      //const在*前面,表示arr是常量指针
      void test_arr(const int arr[])
      {//函数体内无法通过sizeof(arr)获取传入数组的真实大小
      a[0]=2;//编译错误
      }
    • 函数体内无法通过sizeof(arr)获取传入数组的真实大小

      • 解决1:将数组长度传进函数

      • 解决2:在函数内部不调用超出数组范围的元素

1.2 对象数组

  1. Point p[5];//每个数组元素都是一个Point类的对象
    p[2].x;//通过“.”访问元素的成员
    • Point p[2] = {Point(4,5),Point(3,2)};//调用构造函数
      Point p[2] = {Point(4,5)};//第一个元素调用构造函数,第二个元素调用默认构造函数
      //若类中没有默认构造函数(不带参的构造函数),则会报错
    • 数组中每一个对象被删除时,系统都要调用一次析构函数初始化

2、 指针(简述)

  1. 指针是一种数据类型。指针类型的变量称为指针变量。指针变量的作用是存放内存单元地址
  2. int a=10;    //定义int类型变量a,值为10
    int *ptr=&a; //定义int*类型变量ptr,值为&a(a的地址)
    //此时ptr是个指针变量,*ptr在内存中找到与ptr值相同的地址,返回那个地址上存储的值
    cout<<ptr<<endl; //ptr表示i在内存空间中的地址
    cout<<*ptr<<endl; //*ptr表示的就是i的值,
    cout<<i<<endl;
  3. 地址相关的运算
    • *  指针运算符,获取指针所指向的变量的值
    • &  取地址运算符,获取一个对象的地址
  4. 一般情况下,指针的值只能赋给相同类型的指针
    • void类型指针,可以存储任何类型的对象地址
    • 经过类型显示转换,通过void类型的指针可以访问任何类型的数据
  5. 指针运算(加减)
    • 同一类型的指针与指针之间

      • 计算结果:数据单元个数,而不是字节数、
      • int a[10];
        int *p=a;
        int *q=a+6;
        p-q //值为6,表示从p开始,到q之前的数据单元个数(包含p,不包含q)
    • 指针与整数之间 
      • 计算结果:指针
      • int a[3];
        int *p=a;
        p //表示a[0]的地址
        p+1 //表示a[1]的地址
        *(p+1) //表示a[1]的值
    • 指针和0的关系运算
      • if(p==0){}
        if(p!=0){}
        if(p){}
  6. 指针传参:速度快
  7. 函数指针与指针函数
    • 函数指针:指向一个函数的指针

      • 数据类型 (*函数指针名)(形参表)
    • 指针函数:返回值是指针的一个函数
      • 数据类型 * 函数名(参数表)
        {
        函数体
        }
  8. 对象指针
    • 对象指针是用来存放对象地址的变量

      Point *pointPtr;
      Point p1;
      pointPtr = &p1;
  9. this指针
    • this指针是一个隐含于每一个类的非静态成员函数中的特殊指针,用于指向正在被成员函数操作的对象
    • 解决了类中函数形参类中成员同名问题
  10. 动态内存分配返回一个指针
    • 申请对象空间

      int *p;
      p=new int(2); //p指向一个int类型的变量,这变量值为2
      p=new int(); //p指向一个int类型的变量,这变量值为0
      //上一行代码没有调用构造函数,基本数据类型没有构造函数,new一个对象会调用构造函数
      p=new int; //p指向一个int类型的变量,这变量无初始值
      /*=====================================================================*/
      //若用户定义了默认构造函数,下面程序的效果相同,都调用用户定义了的默认构造函数
      new T; //若用户未定义默认构造函数,则这个会调用隐含的默认构造函数
      new T(); //若用户未定义默认构造函数,这个会对基本数据类型的成员和指针类型成员用0初始化
    • 申请数组空间
      int *p;
      p=new int[6];
    • 释放空间
      delete ptr;//释放对象空间
      delete []ptr;//释放数组空间

3、字符串

  1. 字符串常量是用一对双引号括起来的字符序列,如hello world!
  2. 存储时在字符后面加'\0',它的ASCII码值为0。要记得多申请1个空间
  3. //以下写法等效
    char str[13] = { 'h', 'e ', 'l', 'l' , 'o', ' ' , 'w ', 'o' , 'r' , 'l' , 'd' , '!' , '\0'};
    char str[13] = "hello world!"; //这时末尾会自动加'\0'
    char str[] = "hello world!";

【C++复习】第六章 数组、指针、字符串的更多相关文章

  1. 【读书笔记】C#高级编程 第六章 数组

    (一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同 ...

  2. C语言 第七章 数组与字符串

    一.数组 1.1.数组的概念 用来存储一组相同类型数据的数据结构.有点像班上放手机的手机袋,超市的储物柜. 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. ...

  3. Java入门 第一季第六章 数组

    这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/85 6-1什么是数组 数组中的元素都能够通过下标来訪问.下标从 0 開始.比如,能够通过 sc ...

  4. C和指针 第六章 数组名与指针

    指针的算术运算符是指针和数组之间的一种关联,但不是唯一关联: 可以使用数组名作为指向数组第一个元素的指针,但是不可以给数组名赋新的值. //如下声明a int a[10]; //用a作为指向数组第一个 ...

  5. 第三章 数组与字符串 UVa1588 Kickdown

    题目要求简述:给定长度分别为n1,n2(n1,n2<=100)且每列的高度只为1或者2的长条.需要将他们放入一个高度为3的容器,问能够容纳它们的最短容器长度. 分析: 对于这样的题目显而易见有两 ...

  6. java面向对象编程——第六章 数组

    1.数组概述 数组是存储在一个连续的内存块中的元素集合.数组中的每个元素必须是相同的数据类型,并且通过索引进行区分.数组中的第一个元素的索引为0. 在java中,创建数组有两个步骤: 声明一个对数组的 ...

  7. 【3】python核心编程 第六章-序列:字符串、列表和元组

    1.序列类型操作符 序列操作符 作用 seq[ind] 获得下标为ind 的元素 seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合 seq * expr 序列重复expr 次 ...

  8. Drawable复习—第六章

    一.Drawable的分类及使用 复习知识:①.Drawable有几种类别. ②.在哪里利用xml创建Drawable  ③.类中各个类别如何使用  ④.Drawable的插值器和设置时常.是否保持动 ...

  9. 《Java编程思想》笔记 第十六章 数组

    1 数组 数组和容器比较,数组的优点也只剩访问效率高这一点了. 2 数组是第一级对象 数组也是一个对象,和其他普通对象一样在堆中创建, int[ ] arr  arr是数组的引用. 可以隐式创建数组对 ...

  10. 《数据结构与算法分析:C语言描述》复习——第六章“排序”——冒泡排序

    2014.06.17 01:04 简介: 冒泡排序是O(n^2)级别的交换排序算法,原理简单,属于必知必会的基础算法之一. 思路: 排序要进行N轮,每一轮从尾部逐个向前扫描,遇到逆序对就进行交换.确保 ...

随机推荐

  1. 06.python闭包

    python闭包 什么样的函数是 闭包函数 ? 满足以下条件: 闭:外层函数嵌套了一个内层函数. 包:内层函数调用外层函数命名空间内的名字. 举例如下: def out_func(): # 外层函数 ...

  2. Codeforces Round #838 (Div. 2) D. GCD Queries

    题意 有个长度为n的排列p,[0,1,2,...n-1],你可以进行至多2*n次询问,每次询问两个i,j,返回gcd(pi,pj),让你在规定时间内猜出0在哪两个位置之一 思路 这是一道交互题,询问的 ...

  3. week_9(异常检测)

    Andrew Ng 机器学习笔记 ---By Orangestar Week_9 This week, we will be covering anomaly detection which is w ...

  4. Linu基础 文件IO(读写操作)

    前言 本章讨论普通文件的读写.读写效率.简单介绍文件描述符.IO效率.文件共享和原子操作.dup.文件映射.临时文件. 文件描述符 在Linux系统中,打开的文件是用一个整数来表示的,表示打开文件的整 ...

  5. @Data加在子类上,子类无法获取父类的属性

    1.问题描述 我的子类继承父类,并在子类上加了@Data注解.但在程序运行时,输出的结果只有我在子类中定义的属性,父类的属性没有输出. 这是我定义的子类: 这个是子类继承的父类: 这个是输出结果: 可 ...

  6. 使用 Helm 安装 MQTT 服务器-EMQX

    EMQX ️ Info: 使用 EMQX 通过 Helm3 在 Kubernetes 上部署 EMQX 4.0 集群 | EMQ emqx/deploy/charts/emqx at main-v4. ...

  7. kafka详解(01) - 概述

    kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...

  8. 程序员必备的数据库知识 2:Join 算法

    前言 连接(Join)是关系数据库重要特性,它和事务常被作为数据库与文件系统的两个重要区别项.程序员江湖一直流传着某某 baba 的神秘开发宝典,其中数据库部分有重要一条避免过多表的 Join,奈何 ...

  9. 第三方模块:requests模块和openpyxl模块

    1.第三方模块的下载应由 第三方模块:别人写的模块 一般情况下功能都特别强大 我们如果想使用第三方模块 第一次必须先下载后面才可以反复使用(等同于内置模块) 下载第三方模块的方式 1.pip工具 注意 ...

  10. .Net Core对于`RabbitMQ`封装分布式事件总线

    首先我们需要了解到分布式事件总线是什么: 分布式事件总线是一种在分布式系统中提供事件通知.订阅和发布机制的技术.它允许多个组件或微服务之间的协作和通信,而无需直接耦合或了解彼此的实现细节.通过事件总线 ...