C++ 篇 数组

数组是含有多个数据项的数据结构,并且这些数据项都具有相同的数据类型。这些数据项称为数组的元素,我们可以根据元素在数组中的位置来选取元素。

最简单的数组就是一维数组。数组元素在内存中是依次排列的,如下图所示:

声明一个数组,我们需要指定数组元素的类型和数量。如:

int a[10];
const int* p; // pointer to const 常量指针
int* const p; //constant pointer  指针常量
const int* const p;

数组元素可以是任何类型,数组的长度则必须是常量表达式 (能够在编译期间求值的表达式)。因为程序以后可能需要调整数组的长度,所以一般情况下,我们会使用宏来定义数组的长度:

数组索引
我们可以用数组索引来访问数组中的元素。在 C 语言中,数组索引是从 0 开始的,所以长度为 n 的数组索引范围为 0 ~ n-1。假如 a 是含有 10 个元素的数组,那么这些元素可以依次标记为 a[0], a[1], ..., a[9],如下图所示:

/* clears a */for (i = 0; i < N; i++)    a[i] = 0;
/* reads data into a */for (i = 0; i < N; i++)    scanf("%d", &a[i]);
/* sums the element of a */for (i = 0; i < N; i++)    sum += a[i];

C 语言有一个常被人诟病的问题:不检查数组索引越界 (why?)。当数组索引越界时,程序的行为是未定义的,也就是说任何情况都可能发生。

#include<iostream> 
//#include<stdio.h>
using namespace std;void test0(){int arr[] = {1, 2, 3};printf("arr[3] = %d\n", arr[3]);
}int main()
{test0();}

数组初始化

数组可以像其它变量一样进行初始化,不过数组的初始化需要一些技巧。
数组初始化式最常见的形式是,用大括号包含一组常量表达式,常量表达式之间用逗号分隔。
 

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

如果初始化式比数组短,那么剩余元素被初始化为 0:

int a[10] = {1, 2, 3, 4, 5, 6}; /* initial value of a is {1, 2, 3, 4, 5, 6, 0, 0, 0, 0} */

利用这个特性,我们很容易把数组元素全部初始化为 0:

int a[10] = {0};

注意:初始化式不能比数组长,也不能完全为空。

如果给定了初始化式,我们也可以省略数组的长度:

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

对数组使用 sizeof 运算符
我们可以使用 sizeof 运算符确定数组的大小 (字节)。如果数组 a 包含 10 个整数,那么 sizeof(a) 的值通常为 40。sizeof 运算符也可以确定数组元素的大小,两者相除即得到数组的长度:

sizeof(a) / sizeof(a[0])

这样做有个好处:即使日后数组的长度发生改变,这个 for 循环是不需要发生变化的。为了可读性和通用性,我们往往把 sizeof(a) / sizeof(a[0]) 定义为带参数的宏:

#define SIZE(a) (sizeof(a) / sizeof(a[0]))
...
for (i = 0; i < SIZE(a); i++)    a[i] = 0;

【练】用户输入初始金额,利率和投资年数,程序将打印一张表格。表格将显示输入的利率以及紧随其后 4 个更高利率下的总金额。程序的会话如下:

#include<iostream> 
//#include<stdio.h>
using namespace std;void test0(){double init_balance, rate;int years;cout<<"Enter initial balance:";cin>>init_balance;cout<<"Enter initial rate:";cin>>rate;cout<<"Enter number of years:";cin>>years;cout<<"\nYears ";for(int i = 0; i < 5; i++){//cout<<i+rate<<"% ";printf("%5.2lf%%", i+rate);}cout<<endl;double value[5];for(int i = 0; i < 5; i++)value[i] = init_balance;for(int j = 1; j <= years; j++){cout<<j<<"   ";for(int i = 0; i < 5; i++){ value[i] += value[i] * (rate+i)/100;printf("%7.2lf",value[i]); }cout<<endl;}}int main()
{test0();return 0;
}

多维数组
数组可以有任意维数。其中最常用的是一维数组,其次是二维数组,一般很少见到更高维的数组。如下,我们声明了一个二维数组 (类似数学上的矩阵):
 

int matrix[5][9];

数组 matrix 有 5 行 9 列,且行和列的索引都是从 0 开始的,如下图所示:

就像一维数组和 for 循环是好伙伴一样,二维数组和嵌套的 for 循环是好伙伴。例如,我们可以通过下面的方式创建一个维度为 10 的单位矩阵:

#define N 10 double identity[N][N];
int row, col;for (row = 0; row < N; row++)    for (col = 0; col < N; col++)        if (row == col)  identity[row][col] = 1.0;        else             identity[row][col] = 0.0;

多维数组初始化
通过嵌套一维数组初始化式,我们可以构建二维数组的初始化式:

int matrix[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1},                    {0, 1, 0, 1, 0, 1, 0, 1, 0},                    {0, 1, 0, 1, 1, 0, 0, 1, 0},                    {1, 1, 0, 1, 0, 0, 0, 1, 0},                    {1, 1, 0, 1, 0, 0, 1, 1, 1}};

更高维数组的初始化式可以采取类似的方法构建,C 语言提供了多种方法来简化多维数组的初始化。

  • 如果初始化式的长度不够,那么剩余元素被初始化为 0。如,下面的初始化式只填充了数组的前 3 行,后面 2 行将被初始化为 0。
int matrix[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1},                    {0, 1, 0, 1, 0, 1, 0, 1, 0},                   {0, 1, 0, 1, 1, 0, 0, 1, 0}};
  • 如果内层初始化式不足以填满数组的一行,那么这一行剩余的元素会被初始化为 0。
    int matrix[5][9] = {{1, 1, 1, 1, 1, 0, 1, 1, 1},                   {0, 1, 0, 1, 0, 1, 0, 1},                    {0, 1, 0, 1, 1, 0, 0, 1},                    {1, 1, 0, 1, 0, 0, 0, 1},                    {1, 1, 0, 1, 0, 0, 1, 1, 1}};
  • 甚至,我们可以省略内存的大括号 (不推荐)。
    int matrix[5][9] = {1, 1, 1, 1, 1, 0, 1, 1, 1,                    0, 1, 0, 1, 0, 1, 0, 1, 0,                    0, 1, 0, 1, 1, 0, 0, 1, 0,                    1, 1, 0, 1, 0, 0, 0, 1, 0,                       1, 1, 0, 1, 0, 0, 1, 1, 1};

    编译器一旦发现值足以填满一行,它就开始填充下一行。
    注意:在初始化式中省略内层大括号是非常危险的,因为不小心多写或者少写一个值都会影响后面元素的初始化。

     

常量数组 

无论是一维数组还是二维数组,我们都可以在声明时加上const修饰符而变成 "常量":

const char hex_chars[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',         'A', 'B', 'C', 'D', 'E', 'F'};

程序在运行期间不会对数组进行修改。
const不仅仅可以修饰数组,它可以修饰任意变量。但是const在数组声明中特别有用,因为数组经常包含一些不会发生改变的信息。编译器酌情进行优化,运行效率更高。

【练】写一个随机发牌的程序。用户指定发几张牌,程序打印手牌。程序的会话如下:

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

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

相关文章

C++之创建与使用dll

目录 1、创建dll test.h test.cpp Source.def 2、使用dll testdll.cpp DLL&#xff0c;全称“Dynamic Link Library”&#xff0c;中文名为“动态链接库”&#xff0c;是一种在Windows操作系统中常见的库文件格式。它包含了可以由多个程序同时使用的代码和数据。与静态链接…

09 函数和存储过程

文章目录 函数和存储过程函数创建存储过程创建存储过程和存储函数操作函数和存储过程区别 函数和存储过程 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合&#xff0c;调用存储过程和函数可以简化应用开发工作&#xff0c;提高数据处理的效率。 函数创建 d…

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法&#xff0c;也称为 kNN 或 k-NN&#xff0c;是一种非参数、有监督的学习分类器&#xff0c;它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题&#xff0c;但它通常用作分类算法&#xff0c;假设可以在彼此附近找到相似点。 对于分类…

五个与iOS基础开发相关的案例:

iOS是由苹果公司开发的移动操作系统&#xff0c;专为iPhone、iPad和iPod touch等设备设计。iOS系统以其流畅的用户体验、丰富的功能和强大的安全性而著称&#xff0c;成为全球最受欢迎的移动操作系统之一。iOS基础开发则是构建在这些设备上的应用程序的过程&#xff0c;涉及多个…

JavaScript—— 运算符总结(超全)

JavaScript—— 运算符总结(超全) 1.小括号运算符 ​ ()在我们js执行代码的过程中&#xff0c;一行代码内&#xff0c;优先执行小括号里面的内容; 2. 自增和自减运算符&#xff08;一元运算符&#xff09; 自增&#xff1a;让当前变量1的意思 let num 2 num // 3 num // …

Linux shell 列举当前所有网卡的IPV4地址及网卡名。

命令一&#xff1a; ip -4 addr show | grep inet | awk { printf "%s ", $2; for (i5; i<NF; i) { printf "%s ", $i }; printf "\n" } | awk {print $1, $NF} 命令二&#xff1a; 忽略 lo 环路网卡 ip -4 addr show | grep inet | awk …

标志寄存器

文章目录 标志寄存器是什么ZF标志PF标志SF标志CF标志OF标志adc指令sbb指令cmp指令有条件的转移指令DF标志和串传送指令pushf和popf 标志寄存器是什么 在8086CPU中标志寄存器是一个特殊的寄存器&#xff0c;具有以下3中功能&#xff1a; 1.用来存储相关指令的某些执行结果 2.用…

.SVN 信息泄露漏洞原理以及修复方法

漏洞名称&#xff1a;.SVN信息泄露、版本管理工具文件信息泄漏 漏洞描述&#xff1a;据介绍&#xff0c;SVN&#xff08;subversion&#xff09;是程序员常用的源代码版本管理软件。一旦网站出现SVN 漏洞&#xff0c;其危害远比SQL注入等其它常见网站漏洞更为致命&#xff0c;…

餐饮行业新风口:社区店的成功案例与经营秘诀

在竞争激烈的餐饮行业中&#xff0c;社区店正成为一个新的风口。作为一名90后的鲜奶吧创业者&#xff0c;我在社区开店已经5年时间&#xff0c;下面我将分享一些成功的社区店案例&#xff0c;并揭示其经营秘诀。 1、案例一&#xff1a;特色小吃店 这家小吃店以地方特色美食为…

MySQL安装与卸载

安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装(全部默认就可以) 安装MySQL的相关组件&#xff0c;这个过程可能需要耗时几分钟&#xff0c;耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 配置 安装好MySQL之后&#xff0c;还需要配置环境变量&am…

平台总线--ID匹配和设备树匹配

一、ID匹配之框架代码 id匹配&#xff08;可想象成八字匹配&#xff09;&#xff1a;一个驱动可以对应多个设备 ------优先级次低 注意事项&#xff1a; device模块中&#xff0c;id的name成员必须与struct platform_device中的name成员内容一致&#xff0c;因此device模块中…

数据结构与算法-插值查找

引言 在计算机科学的广阔天地中&#xff0c;数据结构和算法扮演着至关重要的角色。它们优化了信息处理的方式&#xff0c;使得我们在面对海量数据时能够高效、准确地进行检索与分析。本文将聚焦于一种基于有序数组且利用元素分布规律的查找算法——插值查找&#xff08;Interpo…

C++面向对象程序设计-北京大学-郭炜【课程笔记(五)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;五&#xff09;】 1、常量对象、常量成员函数1.1、常量对象1.2、常量成员函数1.3、常引用 2、友元&#xff08;friends&#xff09;2.1、友元函数2.2、友元类 3、运算符重载的基本概念3.1、运算符重载 4、赋值运算符的重…

二维码门楼牌管理系统应用场景:推动旅游与文化产业的智慧化升级

文章目录 前言一、二维码门楼牌管理系统在旅游领域的应用二、二维码门楼牌管理系统在文化产业的应用三、结语 前言 随着信息技术的不断发展&#xff0c;二维码门楼牌管理系统作为一种创新的信息化手段&#xff0c;正在逐渐渗透到旅游和文化领域。它通过为文化景点、旅游景点和…

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。SCMI 是可扩展的,目前提供了以下接口: • 支持的接口的发现和自描述…

Java Map接口实现类之 HashMap

定义 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{static final int DEFAULT_INITIAL_CAPACITY 1 << 4; //默认初始化容积&#xff0c;就是默认数组的长度为 16static final int MAXIMUM_CAP…

keep-alive 页面切换不触发onActivated和onDeactivated方法周期

<keep-alive :include"tagList"><component :is"Component" /></keep-alive>const tagList computed(() > {return $store.state.tagList })原因&#xff1a; store.state.app.tagList返回的是一个 Proxy&#xff0c; 代理了数组&am…

openxml获取xlsx的Excel.Validation

在 Open XML SDK 中&#xff0c;无法直接使用 Excel.Range 和 Excel.Validation&#xff0c;因为这是 VSTO (Visual Studio Tools for Office) 的概念&#xff0c;而不是 Open XML SDK 的概念。Open XML SDK 提供了对 Office Open XML (OOXML) 文件格式的低级访问&#xff0c;而…

Docker上部署LPG(loki+promtail+grafana)踩坑复盘

Docker上部署LPG&#xff08;lokipromtailgrafana&#xff09;踩坑复盘 声明网上配置部署踩坑 声明 参考掘金文章&#xff1a;https://juejin.cn/post/7008424451704356872 版本高的用docker compose命令&#xff0c;版本低的用docker-compose 按照文章描述&#xff0c;主要准备…

Windows下PostgreSQL安装教程

一、下载 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads