C语言——数组

数组

基本概念:

数组是相同类型有序数据的集合,用统一的数组名来表示, 数组中的每一个分量------元素用下标来区分。管理某种相同的数列。

特征:

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

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

一般形式:

说明:

下标(索引):代表了数组中元素距离第一个元素的偏移位置(初值为0)。

数组中元素的地址值,下标越大,地址值越大。

一维数组

定义形式:

类型说明符 数组名【常量表达式】

说明:

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

2.数组名也是标识符,我们所说的数组(名),大家可以理解为数据类型是数组的变量(名)。

3.数组容量也可以叫做常量表达式,举例:int ages[10],int lcd[1024*768]

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

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

深入了解:

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

2.定义一个数组,相当于定义了多个匿名变量,这些变量可以通过**数组名【下标】**来标识

eg:

int arr [10]

//最大下标为9,最小下标0

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

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

eg(斐波那契数列):

#include <stdio.h>

int main()

{

int i;

int f[20]= {1,1};

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

for(i=2;i<length;i++)

{

f[i] = f[i -2] + f[i -1 ];

}

for(i=0;i < length;i++)

{

if(i %5 ==0)

{

printf("\n");

}

printf("%6d",f[i]);

}

printf("\n");

return 0;

}

数组的初始化

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

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

语法规则:

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

注意:

1.数组可以部分初始化;也就是可以给数组中前几个元素初始化,未被初始化的元素系统将自动初始化,如0;

2.如果定义数组时未指定数据容量,则系统会根据初始化元素的个数来决定数组容量。

3.int arr[] = {1,2,3,4,5}等价于int arr[5] = {1,2,3,4,5}

4.若要全部元素值为0,可以写成: int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10={0};

数组的默认值

int ==> 0

char ==> \0

float,double ==> 0.0

数组元素的访问

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

访问方式:

数组名 [下标];

注意:

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

eg:

/

需求:一维数组案例-引用数组元素。利用循环给数组元素a[0]~a[9]赋值0~9,并且逆序输3 */

#include

int main()

{

// 创建一个数组

int arr[10];

// 使用for循环给数组赋值

for(int i = 0;i 10;i++)

{

arr[i] = i;

}

// 逆序输出

// 我们通过循环将数组中的元素一个个取出来,称之为遍历

for(int j = 9;j >= 0;j--)

{

printf("%d ",arr[j]);

}

printf("\n"); // 纯粹换行

return 0;

}

数组的典型应用:

冒泡排序

向后冒泡思想:

  1. 一次只排好一个数,针对n个数,最差情况需要 n-1次就可以排好

  2. 每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较大/较小的数就会出现在最后,这也是该数应该有的位置。

  3. 在余下的数中,再次应用第2步的操作,直到只剩下一个数。

向前冒泡思想:

  1. 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好

  2. 每次排序假定第一个元素是最大/最小的,用第一个元素的后面的元素一一与第一个元素比较,遇到较大/较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数;

  3. 在余下的数中,再次应用第2步的操作,直到只剩下一个数。

eg:

#include <stdio.h>

int main()

{

int t,j,i;

int arr[10];

printf("请输入十个整数:\n");

int length = sizeof(arr) / sizeof(int);

for(i=0;i<length;i++)

{

scanf("%d",&arr[i]);

}

printf("\n");

for(j=0; j<length;j++)

{

for(i=1;i<length;i++)

{

if(arr[i-1]>arr[i])

{

t=arr[i];

arr[i]=arr[i-1];

arr[i-1]=t;

}

}

}

for(i=0;i<length;i++)

{

printf("%d ",arr[i]);

}

printf("\n");

return 0;

}

日期计算

/*

需求:一维数组案例-从键盘输入年、月、日,计算并输出该日是该年的第几天。

*/

#include

int main()

{

// 定义变量:年,月,日,统计总天数,循环变量,用来遍历当前月前面的月份

int year,month,day,sum,k;

// 定义一个数组,用来存放1~12月每月的天数

int t[] = {31,0,31,30,31,30,31,31,30,31,30,31};// 柔性数组

printf("请输入年份、月份、天:\n");

scanf("%d,%d,%d",&year,&month,&day);

// 因为二月比较特殊,存在平年和润年这样的因素,所以需要进行平年和润年的判断18 if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)

{

t[1] = 29; // 润年 2月 29天

}

else

{

t[1] = 28; // 平年 2月 28天

}

sum = day; // 默认记录最后一个月的天数

// 这是该年的第几天

for(k = 0; k <month -1;k++)

{

sum += t[k]; // 叠加前几个月的天数

}

printf("%d月%d日是%d年的第%d天。\n",month,day,year,sum);

return 0;

}

面试题:

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

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

说明:

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

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

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

相关推荐
IT技术分享社区18 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码20 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农27 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
passer__jw76728 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾34 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序42 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
&岁月不待人&1 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化