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语言笔记的更多相关文章

  1. C语言笔记 06_作用域&数组

    作用域 任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量: 在函数或块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定 ...

  2. Go 语言笔记

    Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...

  3. 5_PHP数组_3_数组处理函数及其应用_5_数组遍历语言结构

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组遍历语言结构 1. foreach ( array as $value ) 程序: <?php $int ...

  4. 013-结构体-C语言笔记

    013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...

  5. 011-指针(上)-C语言笔记

    011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...

  6. 010-字符串-C语言笔记

    010-字符串-C语言笔记 学习目标 1.[掌握]二维数组的声明和初始化 2.[掌握]遍历二维数组 3.[掌握]二维数组在内存中的存储 4.[掌握]二维数组与函数 5.[掌握]字符串 一.二维数组的声 ...

  7. Scala语言笔记 - 第三篇(容器方法篇)

    Scala语言笔记 - 第三篇(容器方法篇) 目录 Scala语言笔记 - 第三篇(容器方法篇) map和flapMap方法: ​ 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程( ...

  8. 手把手和你一起实现一个Web框架实战——EzWeb框架(二)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(二)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 上一篇文章我们实现了框架的雏形,基本地 ...

  9. 手把手和你一起实现一个Web框架实战——EzWeb框架(三)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(三)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 本篇代码,请选择demo3 这一篇文章 ...

随机推荐

  1. 面试话痨(二)C:JAVA String,别以为你穿个马甲我就不认识你了

    面试话痨系列是从技术广度的角度去回答面试官提的问题,适合萌新观看!   面试官,别再问我火箭怎么造了,我知道螺丝的四种拧法,你想听吗? String相关的题目,是面试中经常考察的点,当面试中遇到了St ...

  2. Analysis of endogenous peptides released from osteoarthritic cartilage unravels novel pathogenic markers (解读人:李琼)

    文献名:Analysis of endogenous peptides released from osteoarthritic cartilage unravels novel pathogenic ...

  3. Integration of Metabolomics and Transcriptomics To Reveal Metabolic Characteristics and Key Targets Associated with Cisplatin Resistance in Nonsmall Cell Lung Cancer(解读人:林山云)

    期刊名:J. Proteome Res 发表时间:(2019年8月) IF:3.78 单位: 上海第九人民医院药学系,上海交通大学药学院 上海交通大学药物与生物化学系   物种:人源A549细胞系 技 ...

  4. gRPC(2):客户端创建和调用原理

    1. gRPC 客户端创建流程 1.1 背景 gRPC 是在 HTTP/2 之上实现的 RPC 框架,HTTP/2 是第 7 层(应用层)协议,它运行在 TCP(第 4 层 - 传输层)协议之上,相比 ...

  5. HTML中的IE条件注释,让低版本IE也能正常运行HTML5+CSS3网站的3种解决方案

    最近的项目中,因为需要兼容IE7,IE8,IE9,解研究了IE的条件注释,顺手写下来备忘.  HTML中的IE条件注释 IE条件注释是一种特殊的HTML注释,这种注释只有IE5.0及以上版本才能理解. ...

  6. 第四周java实验

    实验四 类与对象的定义及使用 实验时间 2018-9-20 1.实验目的与要求 (1) 理解用户自定义类的定义: 类是具有相同属性和行为的一组对象的集合.java中,用构造器构造并初始化对象. 类是构 ...

  7. 动态规划-Minimum Cost to Merge Stones

    2019-07-07 15:48:46 问题描述: 问题求解: 最初看到这个问题的时候第一反应就是这个题目和打破气球的题目很类似. 但是我尝试了使用dp将问题直接转为直接合并到一个堆问题复杂度迅速提高 ...

  8. RDD的Cache、Persist、Checkpoint的区别和StorageLevel存储级别划分

    为了增强容错性和高可用,避免上游RDD被重复计算的大量时间开销,Spark RDD设计了包含多种存储级别的缓存和持久化机制,主要有三个概念:Cache.Persist.Checkout. 1.存储级别 ...

  9. 向Hive中传入变量的方式

    Hive向程序中传递变量的方式 暴力替换 字符串替换 正则替换 模板引擎 系统环境变量 shell环境变量:${env:varname} system系统变量:${system:varname} hi ...

  10. OpenCV-Python 相机校准 | 四十九

    目标 在本节中,我们将学习 由相机引起的失真类型, 如何找到相机的固有和非固有特性 如何根据这些特性使图像不失真 基础 一些针孔相机会给图像带来明显的失真.两种主要的变形是径向变形和切向变形. 径向变 ...