009-数组-C语言笔记
009-数组-C语言笔记
学习目标
1.【掌握】数组的声明
2.【掌握】数组元素的赋值和调用
3.【掌握】数组的初始化
4.【掌握】数组的遍历
5.【掌握】数组在内存中的存储
6.【掌握】数组长度计算
7.【掌握】数组的常见应用
8.【掌握】数组作为函数的参数
一、数组的声明
作用:
可以存储指定数据类型指定个数的数据,数组与我们之前学习的变量最大的不同就是我们之前的变量只能存储一个数据,而我们的数组可以存储多个数据。
特点:
1.可以存储多个数据
2.虽然数组可以存储多个数据,但是并不是什么类型的数据都可以存储的。要求存储在数组中的数据的类型要一致,在创建数组的时候指定可以存储的多个数据的类型。
3.虽然数组可以存储多个数据,但不是任意个都能直接往里面存储的,数组之中可以存储的数据的个数是固定的,也是在创建数组的时候指定的,一旦指定,不能改变。
4.存储在数组之中的数据非常方便管理,拿到数组就可以很方便的拿到数组之中的数据
术语:
1.元素:数组中的每一个小空间,就叫做数组的元素。
2.下标/索引:数组之中有很多元素,为了区分每一个元素,C语言就为每一个元素编了一个号,这个号就叫这个元素的下标/索引。下标/索引从0开始递增。
3.长度:元素的个数。
语法:数组元素的数据类型 数组名[数组长度];
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
intmain(){
intarr1[5]; //可以存储5个int类型的数据
floatarr2[8]; //可以存储8个float类型的数据
doublearr3[29]; //可以存储29个double类型的数据
chararr4[3]; //可以存储3个char类型的数据
return0;
}
|
注意:
1.声明数组的时候必须要指定数组的长度!
2.数组的长度可以为0,表示一个数据都不能存储,数组长度也可以为1,表示只能存储一个数据,但长度不能给负数和小数。
3.数组长度可以是常量,变量,宏,表达式。但是长度一旦声明,长度就不能改了。
4.当数组长度为变量的时候,是不能在声明数组的同时为数组元素初始化值的。只能先声明数组,然后再为元素赋值。
二、数组元素的赋值和调用
数组真正用来存储数据的是数组中的元素,而不是数组本身,数组指的是整个数组,所以我们不能直接为数组赋值。所以我们应该将数据赋值给数组中的元素。数组之中有多个元素,元素的本质其实就是一个普通类型的变量。那我们如何确定是为哪个元素赋值呢?
赋值语法:数组名[元素的下标] = 数据;
1
2
3
4
5
|
intarr[3]; //声明一个int类型的数组
arr=10; //错误,不能直接为数组赋值
arr[0]=10; //正确,为数组第一个元素赋值1
arr[0]=11; //正确,元素本质就是普通变量,可以重复赋值
arr[3]=10; //错误,元素个数是3,但下标最大才2.数组下标不能越界
|
调用语法:数组名[元素下标];
1
2
3
4
|
intarr[3]; //声明一个int类型的数组
arr[0]=10; //为元素赋值
intnum=arr[0]; //将第一个元素的值取出赋值给int类型的变量num
intnum1=arr[3]; //下标越界,取不到想要的值
|
三、数组的初始化
在声明数组的同时就初始化数组之中的每一个元素的值。
1
2
3
4
5
|
intarr[3]={1,2,3}; //注意不要越界
intarr1[]={1,2,3}; //如果没有指定元素个数,初始化的时候,后面有多少个数据,C语言就自动确定数组个数
intarr2[3]={1}; //部分初始化.将第一个元素初始化为1,其他元素初始化为0
intarr3[3]={1,2}; //部分初始化,依次从第一个元素初始化,不够的元素初始化为0
intarr4[3]={[1]=100}; //指定下标初始化,其他元素初始化为0
|
注意:
在声明数组的时候初始化元素,如果元素个数使用变量,就不能初始化。在编译的时候,编译器是不知道数组的长度的,所以没法初始化。
1
2
3
4
5
|
intmain(){
intlength=4;
intarr[length];//不初始化就不会报错
//int arr1[length] = {1,2,3}; 这样就不行,会报错
}
|
四、数组的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
intmain(){
//声明数组并为每个元素赋值
intarr[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;
//将每一个元素的下标遍历出来,当做数组的下标就能遍历数组了
//下标 == 数组长度-1
for(inti=0;i<3;i++){
printf("%d\n",arr[i]);
}
return0;
}
|
五、数组在内存中的存储
数组其实就是由指定个数的连续的变量组合成的,存储方式和普通变量存储方式相同,把每一个元素当做一个普通变量。分配内存空间的时候,只是分配多个连续空间分别存储每个元素,而且也是从高地址向低地址连续分配的。每个元素的地址,就是他占用字节的最低字节的地址。
1
2
3
4
|
intarr[3];
arr[0];//低地址,数组的地址就是第一个元素的地址
arr[1];
arr[2];//高地址
|
数组的地址:数组之中第1个元素的地址,就是数组的地址。也就是下标为0的元素的地址。
六、数组长度计算
sizeof(数组名)计算出这个数组在内存中占用的总字节数。
sizeof(数据类型)计算出每个元素在内存中占用的字节数。
元素个数 = sizeof(数组名)/sizeof(数据类型);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h>
intmain(){
intscores[5]={0};
intlength=sizeof(scores)/sizeof(int);//元素个数 = 数组总字节 / 每个元素字节;
//讲用户输入数据存储到数组
for(inti=0;i<length;i++){
printf("请输入第%d个同学的年龄:",i+1);
scanf("%d",&scores[i]);
}
//遍历打印出数组
for(inti=0;i<length;i++){
printf("scores[%d] = %d\n",i,scores[i]);
}
return0;
}
|
七、数组的常见应用
1.求最大值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <stdio.h>
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,4,657,684,5322,64765,8799,45453,34232,345};
//计算数组长度
intlength=sizeof(scores)/sizeof(int);
//假设第一个元素为最大值
intmax=scores[0];
for(inti=1;i<length;i++){
//将max和每个元素相比,大的就赋值给max
if(max<scores[i]){
max=scores[i];
}
}
printf("max = %d\n",max);
return0;
}
|
2.求最小值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <stdio.h>
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,4,657,684,5322,64765,8799,45453,34232,345};
//计算数组长度
intlength=sizeof(scores)/sizeof(int);
//假设第一个元素为最小值
intmin=scores[0];
for(inti=1;i<length;i++){
//将max和每个元素相比,小的就赋值给max
if(min>scores[i]){
min=scores[i];
}
}
printf("min = %d\n",min);
return0;
}
|
3.求累加和
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <stdio.h>
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,4,657,684,5322,64765,8799,45453,34232,345};
//计算数组长度
intlength=sizeof(scores)/sizeof(int);
//sum存储累加和
intsum=0;
for(inti=0;i<length;i++){
sum+=scores[i];
}
printf("sum = %d\n",sum);
return0;
}
|
4.求平均值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,4,657,684,5322,64765,8799,45453,34232,345};
//计算数组长度
intlength=sizeof(scores)/sizeof(int);
//sum存储累加和
intsum=0;
//平均值
floatavg=0;
for(inti=0;i<length;i++){
sum+=scores[i];
}
avg=(float)sum/length;
printf("avg = %.2f\n",avg);
return0;
}
|
5.查找数组是否包含指定元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,4,657,684,5322,64765,8799,45453,34232,345};
//计算数组长度
intlength=sizeof(scores)/sizeof(int);
//需要找的数
intzhaoNum=879;
for(inti=0;i<length;i++){
if(scores[i]==zhaoNum){
printf("找到了\n");
break;
}
if(i==length-1){
printf("没找到\n");
}
}
return0;
}
|
6.查找指定元素在数组中第一次出现的下标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,4,657,684,5322,64765,8799,45453,34232,345};
//计算数组长度
intlength=sizeof(scores)/sizeof(int);
//需要找的数
intzhaoNum=325;
for(inti=0;i<length;i++){
if(scores[i]==zhaoNum){
printf("下标为:%d",i);
break;
}
if(i==length-1){
printf("没找到\n");
}
}
return0;
}
|
7.选择排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#include <stdio.h>
voidselectSort(intarr[],intlength){
//外层控制比较的轮数
for(inti=0;i<length-1;i++){
//内层控制每轮比较的次数
for(intj=i+1;j<length;j++){
//当每轮循环的第一个元素小于后面的元素时
if(arr[i]<arr[j]){
//就交换他们的位置
arr[i]=arr[i]^arr[j];
arr[j]=arr[i]^arr[j];
arr[i]=arr[i]^arr[j];
}
}
}
}
intmain(){
intarr[]={1,3423,54,646,4,2,3423,4,656,34,34,36,4,24,};
//计算数组长度
intlength=sizeof(arr)/sizeof(int);
//调用函数对数组进行排序
selectSort(arr,length);
//遍历打印出排序后的数组
for(inti=0;i<length;i++){
printf("%d ",arr[i]);
}
return0;
}
|
双色球案例练习:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <stdio.h>
#include <stdlib.h>
intcha(intarr[],intlength,intzhaoNum){
//遍历数组
for(inti=0;i<length;i++){
//判断数组中有没有要查找的数据
if(arr[i]==zhaoNum){
//有则返回1
return1;
}
if(i==length-1){
return0;
}
}
return0;
}
intmain(){
intarr[6]={0};
intlength=sizeof(arr)/sizeof(int);
for(inti=0;i<length;i++){
//随机生成1-33的整数
intnum=arc4random_uniform(33)+1;
//调用函数判断数组中是否存在,返回0则不存在
if(cha(arr,length,num)==0){
//不存在就存进数组
arr[i]=num;
}else{
//存在就重新生成
i--;
}
}
//打印出随机生成的6个红球
for(inti=0;i<length;i++){
printf("%d ",arr[i]);
}
return0;
}
|
八、数组作为函数的参数
如果函数的形参是一个数组,在调用这个函数的时候,也必须要为这个函数传入一个相同类型的数组,并且是传入数组的地址。然后函数操作的就是我们传进去那个数组,改变数组中的元素,也就是改变传入的那个数组的元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
voidtest(intnum[]){
num[0]=10;
}
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,44232,345};
//调用函数,传入数组名,数组名就是数组的地址
test(scores);
printf("%d\n",scores[0]);//打印 10
return0;
}
|
注意:当数组作为函数的参数的时候,传入的是数组的地址,一个地址占据8个字节。但一个数组如果占据的内存大于8字节,将不能在函数里通过sizeof计算数组的长度。而且函数里的形参是去内存中申请8个字节存储指针变量,并将传入的数组地址赋值给这个指针变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
voidtest(intnum[]){
printf("%p\n",num);
}
intmain(){
//随便整一个int类型的数组
intscores[]={232,545,23,325,44232,345};
//调用函数,传入数组
test(scores);
printf("%p\n",scores);
return0;
}
|
我们会发现函数中打印的数组地址和我们声明的数组的地址是一致的
009-数组-C语言笔记的更多相关文章
- C语言笔记 06_作用域&数组
作用域 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定 ...
- Go 语言笔记
Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...
- 5_PHP数组_3_数组处理函数及其应用_5_数组遍历语言结构
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组遍历语言结构 1. foreach ( array as $value ) 程序: <?php $int ...
- 013-结构体-C语言笔记
013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...
- 011-指针(上)-C语言笔记
011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...
- 010-字符串-C语言笔记
010-字符串-C语言笔记 学习目标 1.[掌握]二维数组的声明和初始化 2.[掌握]遍历二维数组 3.[掌握]二维数组在内存中的存储 4.[掌握]二维数组与函数 5.[掌握]字符串 一.二维数组的声 ...
- Scala语言笔记 - 第三篇(容器方法篇)
Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...
- 手把手和你一起实现一个Web框架实战——EzWeb框架(二)[Go语言笔记]Go项目实战
手把手和你一起实现一个Web框架实战--EzWeb框架(二)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 上一篇文章我们实现了框架的雏形,基本地 ...
- 手把手和你一起实现一个Web框架实战——EzWeb框架(三)[Go语言笔记]Go项目实战
手把手和你一起实现一个Web框架实战--EzWeb框架(三)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 本篇代码,请选择demo3 这一篇文章 ...
随机推荐
- Git在公司内部的使用规范
Git在公司内部的使用规范 目录 Git在公司内部的使用规范 1.版本定义 2.系统开发环境 3. 分支定义 4.Commit 日志规范 5.开发工作流程: 5.1.常规分支debug流程: 5.2. ...
- 玩转控件:封装Dev的LabelControl和TextEdit
俗话说的好:"工欲善其事必先利其器",作为软件攻城狮也是同样道理,攻城狮开发的软件目的是简化客户的操作,让客户动动手指就可以完成很多事情,减少人力成本.这也是系统/软件存在的目的. ...
- thinkphp 前后端分离
thinkphp 前后端分离 简单记录一下之前学习tp的历程吧. 前端HTML页面渲染 <?php namespace app\index\controller; use think\Contr ...
- html5 window.postMessage 传递数据的使用
window.postMessage(图片介绍): 发送方(图片介绍): 接收方(图片介绍): 个人测试一(iframe): 发送方,地址为:http://localhost:63342/HelloH ...
- 【科创人独家】PingCAP黄东旭:想告诉图灵这个世界现在的样子
创业是投己所好 科创人:作为技术圈内著名艺术青年,哪个瞬间会让您更开心,完成一段优美的代码或者乐谱?还是得到来自外界的欢呼与掌声? 黄东旭:在创业之前的很长一段时间里,完成一段代码.写完一首好曲子那一 ...
- 支持向量机(Support Vector Machine)
本博客是针对Andrew NG在Coursera上发布的Machine Learning课程SVM部分的学习笔记. 目录 前言 最优化目标(Optimization Objective) 最大化边界的 ...
- Linux - 文件的三种时间之atime、ctime、mtime的区别和简单用法
在Linux中,文件或者目录中有三个时间属性 atime ctime mtime 简名 全名 中文 作用 atime Access Time 访问时间 最后一次访问文件(读取或执行)的时间 ctime ...
- mongodb的增加和删除
一 mongodb中使用insert()方法来增加集合中的文档: db.myTable.insert({name:'arvin',age:12}) //对名为myTable的集合插入数据 插入数据 ...
- [codevs2597]团伙<并查集>
题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...
- 添加属于自己的python模块空间
在我们学习python的过程中会遇到很多时候,我们需要自己曾经写过的模块,它可能是一个函数或者其他的东西,,,, 下面是我的解决过程,如果你像将自己建立的文件夹当作你存放自己写的模块的地方,你需要将你 ...