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. ORM数据库查询优化only与defer(select_related与prefetch_related)

    目录 一:数据库查询优化 1.ORM语句特点 2.only 3.defer 4.only与defer区别 5.select_related与prefetch_related 6.select_rela ...

  2. 使用 SmartIDE 开发golang项目

    目录 概述 架构 开发视图 快速开始 安装 SmartIDE CLI 环境 启动 创建环境 安装工具 调试 基本调试 Start 命令调试 很荣幸在去年加入到 SmartIDE 产品组,从事开发工作, ...

  3. axios 中get 和post传参

    axios中get和ppost传参的方式: params是添加到url的请求字符串中的,一般用于get请求. data是添加到请求体(body)中的, 一般用于post请求. 上面,只是一般情况. 其 ...

  4. vulnhub靶场之HACKABLE: III

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Hackable: III,下载地址:https://download.vulnhub.com/hackable/hackable3.ova,下 ...

  5. 浅谈Java并发

    Java并发是比较难的知识点,难于对并发的理解.并发要从操作系统和硬件层面去理解,才会比较深入,而不单单是从编程语言的逻辑去理解. 首先对于并发要清楚的几点: 线程可能在任何时刻被切换.计算机只对硬件 ...

  6. ubunut安装qtcreater

    安装gcc 1 kxb@kxb:~$ gcc -v 2 3 Command 'gcc' not found, but can be installed with: 4 5 sudo apt insta ...

  7. vivo 故障定位平台的探索与实践

    作者:vivo 互联网服务器团队- Liu Xin.Yu Dan 本文基于故障定位项目的实践,围绕根因定位算法的原理进行展开介绍.鉴于算法有一定的复杂度,本文通过图文的方式进行说明,希望即使是不懂技术 ...

  8. ArcGIS实现打点、线路图、色块、自定义弹窗

    闲聊: 马上就要过年了,不知道大家过年都放几天假,小颖公司就只放8天假,就这还有一天是集体调休扣年假,就很··············还不如不放,不过庆幸最近这两周项目也做完了也没啥事,不然就静不下心 ...

  9. angular---angular路由守卫,有的可以访问有的不可以访问,有的路由地址只有在满足条件时候访问,其它禁止访问,

  10. dapr本地托管的服务调用体验与Java SDK的Spring Boot整合

    1 简介 之前在文章<dapr入门与本地托管模式尝试>中介绍了dapr和本地托管,本文我们来介绍如果在代码中使用dapr的服务调用功能,并把它整合到Spring Boot中. Dapr服务 ...