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操作系统中常见的库文件格式。它包含了可以由多个程序同时使用的代码和数据。与静态链接…

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

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

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

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

MySQL安装与卸载

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

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

引言 在计算机科学的广阔天地中&#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;正在逐渐渗透到旅游和文化领域。它通过为文化景点、旅游景点和…

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…

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

计网(复习)黑书

1.整体概述 1.1 什么是Internet 从构成角度&#xff1a; 节点&#xff1a;主机端系统&#xff0c;及其运行的应用程序&#xff1b;路由器、交换机等网络交换设备 边&#xff1a;通信链路&#xff08;同轴电缆、光纤、无线电、卫星&#xff1b;传输速度带宽&#xff08;bps&am…

操作系统:进程优先级

目录 1.进程优先级 1.1.基本概念 1.2.其他概念 1.3.进程切换 2.解读Linux2.6内核进程的调度队列 1.进程优先级 1.1.基本概念 我们在日常生活中的经验&#xff0c;排队的本质就是确认优先级&#xff0c;排队的原因就是资源不足&#xff0c;需要进行分配。那么在内存资源有…

【论文速读】 | DeGPT:通过大语言模型优化反编译器输出

本次分享论文为&#xff1a;DeGPT: Optimizing Decompiler Output with LLM 基本信息 原文作者&#xff1a;Peiwei Hu, Ruigang Liang, Kai Chen 作者单位&#xff1a;中国科学院信息工程研究所&#xff1b;中国科学院大学网络空间安全学院 关键词&#xff1a;反向工程&…

Linux——进程信号(一)

目录 1、信号入门 1.1、技术应用角度的信号 1.2、注意 1.3、信号概念 1.4、用kill -l命令可以查看系统定义的信号列表 1.5、信号处理常见方式概览 2、产生信号 2.1通过终端按键产生信号 Core Dump 2.2、调用系统函数向进程发信号 2.3、由软条件产生信号 3、总结思考…

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时&#xff0c;会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型&#xff0c;它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …

Typescript 哲学 morn on funtion

函数重载 overload 有一些编程语言&#xff08;eg&#xff1a;java&#xff09;允许不同的函数参数&#xff0c;对应不同的函数实现。但是&#xff0c;JavaScript 函数只能有一个实现&#xff0c;必须在这个实现当中&#xff0c;处理不同的参数。因此&#xff0c;函数体内部就…

2024蓝桥杯每日一题(前缀和)

一、第一题&#xff1a;壁画 解题思路&#xff1a;前缀和贪心枚举 仔细思考可以发现B值最大的情况是一段连续的长度为n/2上取整的序列的累加和 【Python程序代码】 import math T int(input()) for _ in range(1,1T):n int(input())s input()l math.ceil(len(s)/…

人工智能在日常生活中的应用

在我们的日常生活中&#xff0c;人工智能已经成为一种无处不在的力量&#xff0c;从智能家居到在线助手&#xff0c;再到高度个性化的服务和推荐&#xff0c;它无声地改变着我们的生活方式和习惯。随着技术的不断进步和普及&#xff0c;人工智能正以前所未有的速度和规模渗透到…

JVM-垃圾收集器G1

G1垃圾回收器 概述&#xff1a; 是一款面向服务器的垃圾收集器,主要针对配备多个处理器及大容量内存的机器. 以极高效率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.G1保留了年轻代和老年代的概念&#xff0c;但不再是物理隔阂了&#xff0c;它们都是&#xff08;可以不连…

在别的地方下载的二次封装Windows镜像怎么安装?GHO镜像详细安装教程

前言 在系统之家或者其他地方下载的镜像文件怎么装到电脑上&#xff1f; 首先要知道系统之家下载的Windows镜像文件基本上都是.iso结尾的&#xff0c;要进入到对应镜像包才能看出系统镜像是什么格式。 如何分辨镜像的格式 选择对应的.iso镜像&#xff0c;点击【鼠标右键】-【装…