【C++复习】第六章 数组、指针、字符串
1、数组
1.1 基本数组
- 数组声明
int a[10];
- 声明时方括号内是元素个数。下标从0开始。
- 第一个元素是
a[0]
,最后一个元素是a[9]
a[n]
表示的是第n+1
个元素
- 二维数组
int b[3][4];
- 数组可以为任何类型,但不能为void类型
- 数组名是一个指针常量
- 存储
- 数组元素在内存中是顺序、连续存储的
- 行优先存储
- 初始化
一维数组初始化
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}};//第一个大小能省,第二个大小不能省
- 数组作为函数参数,传递的是地址
//不加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 对象数组
Point p[5];//每个数组元素都是一个Point类的对象
p[2].x;//通过“.”访问元素的成员Point p[2] = {Point(4,5),Point(3,2)};//调用构造函数
Point p[2] = {Point(4,5)};//第一个元素调用构造函数,第二个元素调用默认构造函数
//若类中没有默认构造函数(不带参的构造函数),则会报错- 数组中每一个对象被删除时,系统都要调用一次析构函数初始化
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;- 地址相关的运算
*
指针运算符,获取指针所指向的变量的值&
取地址运算符,获取一个对象的地址
- 一般情况下,指针的值只能赋给相同类型的指针
- void类型指针,可以存储任何类型的对象地址
- 经过类型显示转换,通过void类型的指针可以访问任何类型的数据
- 指针运算(加减)
- 同一类型的指针与指针之间
- 计算结果:数据单元个数,而不是字节数、
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){}
- 同一类型的指针与指针之间
- 指针传参:速度快
- 函数指针与指针函数
- 函数指针:指向一个函数的指针
数据类型 (*函数指针名)(形参表)
- 指针函数:返回值是指针的一个函数
数据类型 * 函数名(参数表)
{
函数体
}
- 函数指针:指向一个函数的指针
- 对象指针
- 对象指针是用来存放对象地址的变量
Point *pointPtr;
Point p1;
pointPtr = &p1;
- 对象指针是用来存放对象地址的变量
- this指针
- this指针是一个隐含于每一个类的非静态成员函数中的特殊指针,用于指向正在被成员函数操作的对象
- 解决了类中函数形参与类中成员的同名问题
- 动态内存分配返回一个指针
申请对象空间
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、字符串
- 字符串常量是用一对双引号括起来的字符序列,如
hello world!
- 存储时在字符后面加
'\0'
,它的ASCII码值为0
。要记得多申请1个空间 //以下写法等效
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++复习】第六章 数组、指针、字符串的更多相关文章
- 【读书笔记】C#高级编程 第六章 数组
(一)同一类型和不同类型的多个对象 如果需要使用同一类型的多个对象,就可以使用数组或集合(后面章讲). 如果需要使用不同类型的多个对象,可以使用Tuple(元组)类型. (二)简单数组 如果需要使用同 ...
- C语言 第七章 数组与字符串
一.数组 1.1.数组的概念 用来存储一组相同类型数据的数据结构.有点像班上放手机的手机袋,超市的储物柜. 特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素. ...
- Java入门 第一季第六章 数组
这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/85 6-1什么是数组 数组中的元素都能够通过下标来訪问.下标从 0 開始.比如,能够通过 sc ...
- C和指针 第六章 数组名与指针
指针的算术运算符是指针和数组之间的一种关联,但不是唯一关联: 可以使用数组名作为指向数组第一个元素的指针,但是不可以给数组名赋新的值. //如下声明a int a[10]; //用a作为指向数组第一个 ...
- 第三章 数组与字符串 UVa1588 Kickdown
题目要求简述:给定长度分别为n1,n2(n1,n2<=100)且每列的高度只为1或者2的长条.需要将他们放入一个高度为3的容器,问能够容纳它们的最短容器长度. 分析: 对于这样的题目显而易见有两 ...
- java面向对象编程——第六章 数组
1.数组概述 数组是存储在一个连续的内存块中的元素集合.数组中的每个元素必须是相同的数据类型,并且通过索引进行区分.数组中的第一个元素的索引为0. 在java中,创建数组有两个步骤: 声明一个对数组的 ...
- 【3】python核心编程 第六章-序列:字符串、列表和元组
1.序列类型操作符 序列操作符 作用 seq[ind] 获得下标为ind 的元素 seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合 seq * expr 序列重复expr 次 ...
- Drawable复习—第六章
一.Drawable的分类及使用 复习知识:①.Drawable有几种类别. ②.在哪里利用xml创建Drawable ③.类中各个类别如何使用 ④.Drawable的插值器和设置时常.是否保持动 ...
- 《Java编程思想》笔记 第十六章 数组
1 数组 数组和容器比较,数组的优点也只剩访问效率高这一点了. 2 数组是第一级对象 数组也是一个对象,和其他普通对象一样在堆中创建, int[ ] arr arr是数组的引用. 可以隐式创建数组对 ...
- 《数据结构与算法分析:C语言描述》复习——第六章“排序”——冒泡排序
2014.06.17 01:04 简介: 冒泡排序是O(n^2)级别的交换排序算法,原理简单,属于必知必会的基础算法之一. 思路: 排序要进行N轮,每一轮从尾部逐个向前扫描,遇到逆序对就进行交换.确保 ...
随机推荐
- Jenkins基本配置
1.Configure System (系统设置) 在系统设置这里,只需要设置最后面的一项,配置远程服务器地址,即代码最终运行的服务器地址信息,当然这里是可以配置多台远程Linux服务器的,配置完成后 ...
- 0停机迁移Nacos?Java字节码技术来帮忙
摘要:本文介绍如何将Spring Cloud应用从开源Consul无缝迁移至华为云Nacos. 本文分享自华为云社区<0停机迁移Nacos?Java字节码技术来帮忙>,作者:华为云PaaS ...
- Ubuntu20.04 Java相关环境(JDK、Mysql、Redis、nacos、influxdb)部署以及运行
重装了系统,系统版本号为:Ubuntu20.04 1.云平台 登录云平台,选择要重装的服务器,关机.一键重装即可 2.安装jdk 下载jdk-8u341-linux-x64.tar.gz,并复制到服务 ...
- Burp Suite进阶
1.Scanner Burp Scanner主要用于自动检测Web系统的各种漏洞. 首先,确认Burp Suite正常启动并完成浏览器代理的配置.然后进入Burp Proxy,关闭拦截代理功能,快速浏 ...
- Netty-BIO、NIO、AIO、零拷贝-2
Java BIO 编程 一.I/O 模型 1.I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能 2.Java 共支持 3 种网络编程模型/IO 模式:BI ...
- 记一次在CentOS上安装GitLab的流程
1.本次环境说明 系统:Centos7.6 IP地址:http://192.168.3.213: 最低配置要求:2核心CPU和4G内存,这是因为[GitLab]的整体运行包含了多个进程 2.自行安装 ...
- 总结开源项目中的常见坏实践(Bad Practice)
一些开源项目包含了各种编程的最佳实践供人参考学习和借鉴.但是也有一些开源项目虽然初衷是好的.但是包含了一些代码的坏实践.特别是对于一部分刚入行的大学生来说,可能会给到一些错误的示范.于是在此列举一些项 ...
- 旧酒换新瓶,新版M1/M2芯片Macos(Ventura)安装古早版本Python2.7(Python2.x)
向下兼容特性是软件开发系统的一个重要指标,它是指一个新的系统或者软件能够与旧的系统或软件兼容并正常运行.这意味着旧系统或软件可以在新系统或软件中使用,而不会出现问题.向下兼容对于提高软件或系统的可用性 ...
- Js生成图片验证码
上代码 /** * [使用说明] * 1.生成验证码 * 函数: * generateRandomCode( dom对象Id ); * 例: * generateRandomCode( 'id' ); ...
- [cocos2d-x]关于定时器
什么是定时器 定时器的作用就是每隔一段时间,就执行一段自定义的动作,比如飞机向前方移动,子弹的移动等等.该函数定义在CCNode头文件中,基本上cocos2dx中所有的东西都能够使用定时器. 定时器的 ...