首页 > 其他分享 >C语言基础-数组:一维数组与二维数组

C语言基础-数组:一维数组与二维数组

时间:2024-12-10 13:01:50浏览次数:6  
标签:11 arr 下标 数组 int 元素 C语言 一维

数组

例子

如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,假如我们要在程序中表示一组成绩,此时我们所学的常规的数据类型就无法再表示,这时就需要使用一种新的表现形式,这种表现形式就是数组

什么是数组

数组是相同类型,有序数据的集合

数组的特征
  • 数组中的数据被称为数组的元素,是同构的
  • 数组中的元素存放在内存空间里
衍生概念:下标(索引)
  • 下标或索引代表了数组中元素距离第一个元素的偏移位置
  • 数组中的元素地址值,下标越大,地址值越大(每一块内存空间都有一个独有的内存地址,变量空间以字节为单位进行地址的标注,我们也可以说一个内存单元就等于一个字节)
  • 数组的下标是从0开始的

一维数组

数组的定义

语法:

类型说明符  数组名[数组容量]

#include <stdio.h>

int main()
{
    int arr[20];
}

说明:

  • 数组的类型说明符由数组中的元素来决定,也就是元素是什么类型,数组就是什么类型

  • 数组名也是标识符,我们所说的数组(数组名),可以理解为数据类型是数组的变量(变量名),命名规则与变量名相同,遵循标识符命名规则

  • 数组容量也可以叫做元素个数或者常量表达式,表达式必须为整型,可以包含常量和符号常量,但不能是变量

    int arr[5]; //常量
    
    #define COUNT 5
    int arr[COUNT];//符号常量
    
    int arr[800*480]; //常量表达式
    

    类型:代表了数组中元素的类型

    容量:数组中能存储多少个元素,数组容量可以是常量、常量表达式、符号常量,但必须是整数

    深入了解:

    • 定义一个数组,相当于申请了一个可以容纳所指定元素的内存空间。所申请的内存单元是连续的
    • 定义一个数组,相当于定义了多个匿名的变量,这些变量可以通过数组名[下标]来标识
    int arr[10];//最小索引:0;最大索引:9
    

    分析得到

    数组的最大下标 = 数组的元素个数(数组容量) - 1

数组元素的访问

原则:数组中的元素不能一次性访问所有元素,只能一个一个的访问

访问方式:

数组名[下标]

说明:以上语法,既能实现数组中元素的取,也能够实现数组中元素的存

//定义一个能够容纳10个元素的int数组
int arr[10];
//给数组的第一个元素进行赋值
arr[0] = 89;
//访问数组的第一个元素
int a = arr[0];

int b = arr[10]; //error:下标越界异常

注:数组元素的访问不能越界

数组的初始化

定义数组的同时,用指定数据来给对应元素赋值

简化数组定义后,需要对元素一一赋值操作

类型 数组名[容量大小] = {常量1,常量2,...};

注意:

  • 数组可以部分初始化:也就是可以给数组中的前几个元素初始化,未被初始化的元素系统将自动初始化,如果定义数组时未被指定数据容量,则系统会根据初始化元素的个数来决定数组容量。

    // 1.如果定义数组时只给数组前几个元素初始化,后续剩余元素会自动完成初始化
    int arr[10] = {11,12,13,14,15}; //推荐写法,未被初始化的元素补0
    int arr[10] = {11,12,13,14,15,0,0,0,0,0}
    
    // 2.如果定义数组时未指定数组容量,根据初始化元素的个数来决定容量
    int arr[] = {1,2,3,4,5}; //推荐写法,等价于以下写法
    int arr[5] = {1,2,3,4,5};
    

    衍生概念:

    • 柔性数组:在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数组;

    例子:

    在不知道数组类型的情况下,如何确定数组元素的个数

    int length = sizeof(arr) / sizeof(arr[0]);
    

    说明:

    arr就是计算的数组本身,sizeof(arr)用来计算该数组中总字节大小

    sizeof(arr[0])用来计算数组中第一个元素所占的字节大小,因为数组中元素类型相同,所以计算哪一个都行

    sizeof(arr) / sizeof(arr[0])就是用数组中总的字节数除以每一个元素所占的字节数,从而得到元素的个数(容量)

冒泡排序

思想:

  • 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好
  • 每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较大/较小的数就会出现在最后,是该数应在的位置
  • 在剩下的数中,再次应用第二步操作,直到剩下一个数

二维数组

定义

二维数组本质上是一个行列式的组合,也就是说二维数组是由行和列两部分组成的。二维数组是通过行列进行解读的。

二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一个一维数组(也就是数组的元素可以是数组类型)

语法
类型 数组名[行数][列数]; 

举例:

int arr1[3][3] = {{11,12,13},{21,22,23},{31,32,33}};//等价于
int arr1[][3] = {{11,12,13},{21,22,23},{31,32,33}};//柔性数组

int arr2[3][] = {{11,12},{21,22,23},{31}};//错误!!!
int arr2[3][] = {{11,12,0},{21,22,23},{31,0,0}}//错误!!!

int arr3[][] = {{1,2,3},{4,5,6},{7,8,9}} //错误!!!

注意:在C语言中,二维数组在计算机的存储顺序是按行进行的,即第一维的下标变化慢,第二维的下标变化快。

应用场合

主要应用于数据有行列要求的情况。比如说现在要存储学生的成绩。

特殊写法
  • 下标可以是整型表达式,如a[2-1][2*2-1]
  • 下标可以是已经有值的变量或数组元素,如a[2*x-1][b[3][1]]
  • 数组元素可以出现在表达式中,如b[1][2] = a[2][3]/2

注:使用时数组元素的下标应在已定义数组的大小范围内:应注意区别定义数组大小和引用数组元素的区别

初始化
  • 分行给二维数组赋初值
int arr[3][4] = {{11,12,13,14},{21,22,23,24},{31,32,33,34}};
  • 可将所有数据写在一个花括号内,按照排列顺序对元素赋值
int arr[3][4] = {11,12,13,14,21,22,23,24,31,32,33,34}
  • 可对部分元素赋初值,其余未赋值部分自动填充0(整型)| \0(字符型) | 0.0(浮点型)
int arr[3][4] = {{11},{21,22},{31}};
  • 若对全部元素赋初值,自定义数组时可以省略第一维数组的长度,第二维数组的长度必须指明
int a[][4] =  {11,12,13,14,21,22,23,24,31,32,33,34};
  • 在分行赋初值时,也可以省略第一维的长度
int arr[][4] = {{11,12,13},{0},{0,10}};

标签:11,arr,下标,数组,int,元素,C语言,一维
From: https://blog.csdn.net/Are_pro_bald/article/details/144367623

相关文章

  • C语言基础:循环结构
    循环结构什么是循环代码的重复执行,就叫做循环。循环的分类无限循环:其实就是死循环,程序设计中尽量避免无限循环。程序中的无限循环必须是可控的有限循环:循环限定循环次数或者循环的条件。循环的构成循环条件循环体当型循环的实现特点:先判断,后执行,如果条件不满......
  • 数组去重:双指针法的优雅实现
    数组去重:双指针法的优雅实现在日常开发中,数组去重是一个常见的需求。无论是处理用户输入、数据清洗,还是优化算法性能,去重操作都扮演着重要角色。本文将介绍一种高效的去重方法——双指针法,并结合代码示例,帮助你轻松掌握这一技巧。1.问题描述给定一个包含重复元素的数组,要求删......
  • C语言整理第八章(指针)
    指针(二)一,字符指针变量(一)用字符指针指向字符串常量有两种方法初始化和赋值1,初始化intmain(){char*p="Doyouknow?";} 2,赋值intmain(){char*p;p="Doyouknow?";} 其实,无论是初始化还是赋值,都是将字符串的第一个字母的地址赋给指针变量(二)字......
  • 请说说JS中的索引数组、关联数组和静态数组、动态数组的定义与区别
    在JavaScript中,数组的概念比较灵活,不像一些强类型语言那样区分得那么严格。JS中的数组实际上是一种特殊的对象,既可以像索引数组一样通过数字索引访问元素,也可以像关联数组一样通过字符串键访问元素。所以,严格意义上来说,JS只有动态数组,它兼具了索引数组和关联数组的特性。而静......
  • 【Linux探索学习】第二十弹——基础IO:深入理解C语言文件I/O与Linux操作系统中的文件操
    Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482前言:文件I/O(输入输出)操作是现代计算机系统中的重要组成部分,几乎所有的程序都需要与文件进行交互。无论是读取配置文件、写入日志文件,还是处理用户数据,文件操作都是不可避......
  • C语言数据类型与变量
    本章目标1.数据类型介绍2.signed与unsigned3.数据类型的取值4.变量5.算术操作符6。赋值操作符7.单目操作符8.强制类型转换1.数据类型介绍c语言为我们提供了大量的数据类型供我们使用,数据类型能够为我们描述我们常见的数值,和字符。例如int类型(整型)来去描述整数,ch......
  • 春招没赶上……秋招也没赶上的我…只能……C语言编程小练习---24年期末版
    一年一度的期末考试真是迫在眉睫,up为了一解各位大学生燃眉之急,特意准备了这些题目供各位联系: 打印1-100之间能被3整除,且末尾是7的整数。#include<stdio.h>main(){inti,j; for(i=0;i<10 ;i++) {j=i*10+7;  if( j%3!=0) continue;  printf("%d",j);......
  • JS代码片段-Array数组克隆的几种方法
    JavaScript自身提供了几种克隆数组的方法,以下做了汇总,以作参考:1.展开运算符(...) ES6引入了展开运算符(...),这是创建数组浅克隆最常见的方法。leta=[1,2,3,4,5];letb=[...a];2.Array.from()leta=[1,2,3,4,5];letb=Array.from(a);3.Array.prototype.s......
  • 一道C语言指针有关问题的讲解
    原题#include<stdio.h>intmain(){char*c[]={"ENTER","NEW","POINT","FIRST"};char**cp[]={c+3,c+2,c+1,c};char***cpp=cp;printf("%s\n",**++cpp);printf(&quo......
  • 初识C语言(指针、结构体)
    *前言学习C语言自用教材:C程序设计第五版--谭浩强线上课程:跟学博主:鹏哥C语言。视频:1.【初识C语言】认识C语言_哔哩哔哩_bilibili1.指针1.1内存内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。为了有效的使用内存,把内存划分成一个个小的内存单......