c语言数据22数组使用

1.1数组分配的空间

int a[10]={1,2,3,4,5,6,7,8,9,10};//分配空间 元素类型大小int4*元素个数10=40byte

元素之间空间连续

数组名代表数组首元素地址;a 取的是a[0]的地址;&a 是整个数组的地址

说明:

数组首元素地址:

0号元素的地址属性

数组名代表首元素地址

a+1:首字母的地址,偏移一个元素

数组的地址:

数组的地址属性表示整个数组的地址:&a

从地址编号上是一样的,但偏移量是不一样的

&a+1数组的地址,偏移整个数组长度地址

1.2数组初始化

说明:数组初始化就是给数组中每个元素赋初值

规则:

元素个数可以省略 a[]={10,20,30};

初始化个数可以少于元素个数a[10]={10,20,30};//没初始化默认0

数组初始化必须在定义语句中完成

1.3访问下标

1.3.1 数组下标的使用

下标:数组中的元素从0开始编号一直到(数组元素个数-1)

通过数组的下标来锁定数组元素,从而达到操作具体元素的作用

格式:数组名[下标号] //数组元素相应编号的内容

元素内容与地址:

数组名[编号]; //某号元素的内容

&数组名[编号]; //某号元素的地址

1.3.2数组名访问数组元素

数组名代表数组首元素地址

(数组名+i)的形式表示数组i号元素的地址

*(数组名+i)的形式 表示i号元素的内容

1.3.3通过指针的形式访问数组的元素

说明:通过指针来操作数组中的元素,首先要定义一个指针

指针指向对象类型 是元素的数据类型 数组的类型

int *p;

通过指针操作数组的话用 int (*p)[5];

//获取首元素地址

p=&a[0]; //(p=a;)

//下一个元素的地址及内容

p++;

//指针可能会偏移,需要指针重新指向首元素

1.4数组的应用

1.4.1数组元素累加

需求:定义一个10个元素的数组,每个元素是int类型,用户输入十个整型数据,求平均值。

分析:1通过循环结构将数据输入数据

int sum=0;

int val;

printf();

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

{

scanf("%d",&a[i])

}

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

{

sum+=a[i];

}

val=sum/10.0;

printf("%d",val);

2对数组累加和

3求平均值打印

1.4.2数组排序--冒泡排序

可以将数组中的数据进行从大到小或者从小到大排序

排序原理:

通过与后面各个位数据比较将最大/最小的值找出来。

若需要将数组从大到小进行排序,通过两两比较的方式将最小的数据排到最后,然后是次小.....

考虑循环的次数,和遍历的数量。

在第一次循环时,最小的数被排到了最后,因此在下一次排序时不需要遍历到最后一位,其他以此类推......因此遍历的数量为 数据个数-轮数

循环的最后一次,应该是最大和次大的数进行比较,因此所需要循环的循环次数为 数据个数-1

两层循环:

for(i=1;i<数据个数;i++)

{

for(j=0;j<数据个数-轮数;j++)

{

//从小到大

if(a[j]<a[j+1])

{

数据交换

/*这样排序不是将第一个数变成最大数,而是想将最后一个数变成最小数*/

}

}

}

1.4.3选择排序

相对于冒泡排序,选择排序更为直接,通过与后面各个数进行比较后将符合的放在最前面的位置

第一次循环将第一位数据换成我们需要的值....下一次循环的起点应该从下一个数据开始遍历

最后一次为最小数和次小数间比较因此循环次数为.....数据个数-1

如果我要找一个十个数据中的最大值,定义一个a变量让他的值与数组其中一个元素相等

然后让他和数组中其他元素进行比较,若遇到更大的数则得到改值继续往后比较,最终打印a即可

int t[10]={1,5,7,4,6,5,4,4,5,3,}

int a=t[0];

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

{

if(a<t[i+1])

{

a=t[i+1];

}

}

printf("%d",a);

同样的,我可以不定义a,直接用a[0]来接收最大值

int t[10]={1,5,7,4,6,5,4,4,5,3,}

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

{

if(t[0]<t[i+1])

{

t[0]=t[i+1];

}

}

printf("%d",t[0]);

但是这样只是让第一个元素复制了其中最大的值,因此需要中间变量使数组进行交换

int t[10]={1,5,7,4,6,5,4,4,5,3,};

int a;

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

{

if(t[0]<t[i+1])

{

i=t[0];

t[0]=t[i+1];

t[i+1]=i;

}

}

printf("%d",t[0]);

这样第一个数就是最大数,接着后几位按照这个方式循环比较

int t[10]={1,5,7,4,6,5,4,4,5,3,};

int a;

for(int j=0;j<10-1;j++)

{

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

{

if(t[j]<t[i+1])

{

a=t[j];

t[j]=t[i+1];//这样会把第一个值变为我们最需要的值

t[i+1]=a;

}

}

}

相关推荐
雨中rain9 分钟前
贪心算法(1)
算法·贪心算法
不爱学习的YY酱15 分钟前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
zongzi_49420 分钟前
二次封装的天气时间日历选择组件
开发语言·javascript·ecmascript
平头哥在等你26 分钟前
求一个3*3矩阵对角线元素之和
c语言·算法·矩阵
飞滕人生TYF29 分钟前
动态规划 详解
算法·动态规划
kikyo哎哟喂31 分钟前
Java 代理模式详解
java·开发语言·代理模式
_OLi_32 分钟前
力扣 LeetCode 106. 从中序与后序遍历序列构造二叉树(Day9:二叉树)
数据结构·算法·leetcode
duration~36 分钟前
SpringAOP模拟实现
java·开发语言
一条晒干的咸魚1 小时前
【Web前端】实现基于 Promise 的 API:alarm API
开发语言·前端·javascript·api·promise
尹蓝锐1 小时前
C语言-11-18笔记
c语言