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;

}

}

}

相关推荐
脱氧核糖核酸__28 分钟前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
techdashen1 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
星空椰1 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript
忒可君1 小时前
C# winform 自制分页功能
android·开发语言·c#
Rust研习社1 小时前
Rust 智能指针 Cell 与 RefCell 的内部可变性
开发语言·后端·rust
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
_日拱一卒1 小时前
LeetCode:2两数相加
算法·leetcode·职场和发展
py有趣1 小时前
力扣热门100题之零钱兑换
算法·leetcode
董董灿是个攻城狮2 小时前
Opus 4.7 来了,我并不建议你升级
算法