首页 > 其他分享 >C语言基础:数组(一维数组)

C语言基础:数组(一维数组)

时间:2024-12-12 12:56:41浏览次数:11  
标签:10 arr 数组 int 元素 C语言 一维 printf

引例

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

什么是数组

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

数据的特征

  • 数组中的数据被称为数组的元素,是同构的。

  • 数组中的元素存放在内存空间里(如:char ct_name[20]:在内存中申请6块连续的基于char类型的变量空间)

衍生概念:下标(索引)
  • 下标或索引代表了数组中元素举例第一个元素的偏移位置。

  • 数组中的元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址,变量空间以字节为单位进行地址的标注,我们也可以说一个内存单元=1字节

  • 数组的下标是从0开始。

一维数组

数组的定义

语法:

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

说明:

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

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

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

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

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

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

深入理解:

· 定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存空间。所申请的内存单元是连续的。

· 定义一个数组,相当于定义了多个匿名的变量,这些变量可以通过数组名[下标]来标识。

举例:

 //定义一个数组
 int arr[10];//问题:这个数组中,最小索引:0,最大索引:9,最大索引 = 数组元素个数-1

经过上面的案例,分析得到:

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

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

语法:

 数组名[下标]

注意:以上语法,即能实现数组中元素的取,也能够实现数组中元素的存。

举例:

 //定义一个容纳10个元素的int数组
 int arr[10];
 //给数组的第一个元素进行赋值
 arr[0] = 89;
 arr[0] = 88;
 ​
 //访问数组的第一个元素
 int a = arr[0]; // 88
 ​
 //问题:以下访问是否正确
 int b = arr [10]; // error:下标越界异常  

注意:数组元素的访问一定不能越界。

案例:

 #include <stdio.h>
 //需求:一维数组案例-引用数组元素。利用循环给数组元素赋值,并且逆序输出。
 int main ()
 {
     //创建一个数组
     int arr[10];
     //利用for循环给数组元素赋值
     for(int i = 0;i < 10;i++)
     {
         arr[i] = i + 10;
     }
     //逆序输出
     //通过一个循环将数组中的每一个元素取出,称之为遍历
     for(int j = 9;j >= 0;j--)
     {
         printf("%-4d",arr[j]);
     }
     printf("\n");
     return 0;
 }
数组的初始化

数组的初始化:定义数组的同时,用指定数据来给对应元素赋值。

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

语法:

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

注意:

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

 //1.如果定义数组时只给数组前几个元素初始化,后续剩余元素会自动完成初始化
 int arr[10] = {11,12,13,14,15}; //推荐写法,等价以下写法
 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 arr[] = {1,2,3,4,5}

面试题:

  • 在不知道数组类型的情况下,如何缺点数组元素的个数

 int length = siezof(arr) / size(arr[0]);

说明:

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

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

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

一维数组案例
案例1:
 
#include <stdio.h>
 //需求:一维数组案例-斐波拉契数列
 int main ()
 {
     int i; //循环变量
     int f[20] = {1,1}; // 定义一个数组,用来存储数列,默认存储第1位和第2位
     //计算获取数组的大小,主要用于遍历数组
     int len = siezof(f)/sizeof(f[0]);
     //将生成的序列存入数组(索引绕过0和1)
     for(int i = 2;i < len; i++)
     {
         // 给数组元素赋值,从数组的第三个元素开始
         f [i] = f[i - 1] + f[i - 2] 
     }
     //遍历数组
     for(int j = 0; j < len; j++)
     {
         // 遍历的时候,要求一行显示5个数
         if (j % 5 == 0)
         {
             printf("\n");
         }
         printf("%-6d",f[j]);
     }
     printf("\n");
     return 0;
 }

冒泡排序案例

案例2:
 #include <stdio.h>
 //需求:一维数组案例——冒泡排序
 int main()
 {
     //创建一个数组,用来存储排序的序列
     int arr[10];
     //i:外层-比较的轮数,j:内层-每一轮比较的次数,temp:临时变量,用来比较时交换数据
     int i,j,temp;
     printf("请输入10个测试整数:\n");
     //计算数组的大小
     int len = sizeof(arr) / sizeof(arr[o]);
     for(i = 0; i < len; i++)
     {
         scanf("%d",&arr[i]);
     }
     printf("\n");
     //对数组arr使用冒泡排序 (注意:我们使用的标准的冒泡排序,大家也可自行优化,比如鸡尾酒排序)
     //外层循环:控制比较轮数,轮数 = 数组容量 - 1,这个案例比9轮
     for(i = 0; i < len - 1;i++)
     {
         //内层循环:每一轮比较的次数,每一轮比较的次数:
         for(j = 0; j < len - 1 - i;j++)
         {
             //相邻的两个数比较,满足条件就交换位置
             if(arr[j] > arr[j+1])
             {
                 temp = arr[j]
                 arr[j] = arr[j+1];
                 arr[j+1] = temp;
             }
         }
     }
     printf("冒泡排序后遍历数组:\n");
     for(i = 0; i < len; i++)
     {
         printf("%-4d",arr[i]);
     }
     return 0;
 }
案例3:
 #include <stdio.h>
 // 需求:从键盘输入年、月、日,并计算输出是该年的第几天
 int main ()
 {
     // 定义变量:年,月,日,统计天数,循环变量,用来遍历当前月前面的月份
     int year,mouth,day,sum,k;
     //定义一个数组,用来存放1~12月每月的天数
     int t[] = {31,28,31,30,31,30,31,31,30,31,30,31};//柔性数组
     printf("请输入年份、月份、天:(使用-分隔)\n");
     scanf("%d-%d-%d",&year,&mouth,&day);//2024-12-3
     //因为二月比较特殊,存在平年和闰年的因素,所以要进行判断处理
     if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//优先级:算术 > 关系 > 逻辑
     {
         t[1] = 29;//闰年
     }
     //先将输入的天纪律到总天数
     sum = day;
     // 计算当前月前的所有月的天数
     for(k = 0; k < month - 1;k++)
     {
         sum += t[k];
     }
     printf("%d月%d日是%年的第%d天.\n",mouth,day,year,sum);
     return 0;
 }

标签:10,arr,数组,int,元素,C语言,一维,printf
From: https://blog.csdn.net/weixin_51619876/article/details/144424051

相关文章

  • C语言基础:数组(二维数组)
    数组二维数组定义:二维数组本质上是一个行列式的组合,也就是说二维数组是由行和列两部分组成。二维数组数据是通过行列解读。二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。(也就是说数组的元素可以是数组类型)。语法 类型......
  • C++学习笔记 数组
    1.一维数组1.1数组的定义数组的定义方式和变量类似。#include<iostream>#include<algorithm>usingnamespacestd;intmain(){inta[10],b[10];floatf[33];doubled[123];charc[21];return0;}1.2数组的初始化在main函数内部,未初......
  • 计算从一个大数组中(如1万条数据)取出第一数据和最后一条数据的时间分别是多少?
    在JavaScript前端开发中,从一个包含1万条数据的数组中获取第一条和最后一条数据的时间复杂度非常低,通常可以认为是常数时间O(1)。这与数组的大小几乎无关。原因是JavaScript数组是基于索引的,访问特定索引的元素可以直接通过索引进行,无需遍历或搜索。以下是一些说明:获......
  • 一些可能不太常见的C语言开发使用技巧
    1.复合字面量(CompoundLiterals)[C99]复合字面量是在C99中引入的,允许你在代码中直接定义结构体、数组或其他复杂数据类型的字面量。这种技巧可以简化代码,尤其是在需要临时生成复杂数据结构时。#include<stdio.h>structPoint{intx,y;};intmain(){//......
  • ### 使用C语言优化解决八皇后问题
    八皇后问题是一道经典的算法问题,它要求在8×8的棋盘上放置8个皇后,使得任何两个皇后都不能互相攻击。本文通过改进传统回溯算法的实现,采用占用标记数组优化冲突检测,从而提升算法效率。####八皇后问题的规则在八皇后问题中,每个皇后必须满足以下规则:1.不能位于同一行。2.不......
  • ### 最大化相邻字符ASCII码之差的最小值:C语言实现与详解
    在字符串处理问题中,如何调整字符的排列以最大化相邻字符ASCII码之差的最小值是一个有趣的挑战。本文将通过一个具体的C语言实现,带你了解这一问题的解决思路和代码细节。####问题描述给定一个字符串,通过调整其字符顺序,使得字符串中任意相邻字符ASCII码之差的最小值最大。###......
  • C语言编程1.24螺旋方阵
    题目描述本题要求从右下角开始按螺旋型递减打印数字方阵。输入格式输入为一个正整数n(1=<n<=20)。输出格式螺旋型递减顺序输出n行n列的数字方阵,每个数字占4个宽度,左对齐。输入样例复制在这里给出一组输入。例如:4输出样例复制在这里给出相应的输出。例如:1098......
  • c语言编程1.23报数
    题目描述输入两个正整数n和m((1<m<n<=50)),有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数m的人退出圈子,下一个人从1开始重新报数,报数m的人退出圈子。如此循环,直到留下最后一个人。请按退出顺序输出退出圈子的人的编号,以及最后一个人的编号。提示:将......
  • C语言之初识数组存在的问题
        首先我们先了解数组的概念,所谓数组,简单来说数组就是一组相同元素的集合。是用来存放一组相同类型元素的存储形式。    但是我们在开始学数组的时候会存在一些问题或者说是疑问。    1.数组的下表是从‘0’开始,所以我们在访问数组的某个元素时,我......
  • 投票法(选择数组中出现最多的数字)可以map代替
    include<stdio.h>//找到数组中出现次数超过一半的数字intfindMostFrequent(int*input,intlength){//候选数字初始化为数组第一个元素intcandidate=input[0];//计数初始化为1intcount=1;//遍历数组for(inti=1;i<length;i++){//如果当前数......