0%

数组

文章时效性提示

本文发布于 517 天前,部分信息可能已经改变,请注意甄别。

数组是一组相同类型元素的集合。
type_t arr_name [const_n]
type_t 指的就是数组的元素类型。
const_n 是一个常量表达式,用来指定数组的大小。


int arr[10];
创建一个数组,存放整型变量,10个
char arr2[5];
创建一个数组-存放字符-5个

1
2
int n = 5;
char ch[n];

上面的方式是不行的,方括号内必须是常量表达式,不能是变量。
float arr4[1];
创建一个数组,存放float型数据,1个
double arr5[3];
创建double型数组,存放3个数据


数组的初始化

int arr[10] = {1,2,3};
上面是一个不完全初始化,只有前三个是1,2,3,剩下的元素默认是0。
char arr2[5] = {'a','b'};
上面是一个char型数组的不完全初始化,前两个分别是a,b,剩下的默认是0。
char arr2[5] = “ab”;
上面是一个char型数组的不完全初始化,前三个分别是a,b,\0,剩下的默认是0。
char arr2[] = “abcdef”;
上面的数组根据初始化内容确定数组大小,大小是7,分别是abcdef和\0。

1
2
3
char arr[] = "abcdef";
printf("%d ",sizeof(arr));
printf("%d\n",strlen(arr));

打印的结果是7 6,sizeof计算\0,strlen不计算\0。
1、strlen和sizeof没有什么关联。
2、strlen只能求字符串长度。
3、sizeof是计算变量、数组、类型的大小,单位是字节。
4、strlen是库函数,需要引用头文件,sizeof是操作符,不需要引用库文件。

总结:
数组是使用下标来访问的,下标是从0开始。
数组的大小可以通过计算得到。
int sz = sizeof(arr)/sizeof(arr[0]);

一维数组在内存中的使用

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int sz = sizeof(arr)/sizeof(arr[0]);
    int i = 0;
    for (i = 0; i<sz; i++) {
        printf("&arr[%d] = %p\n",i,&arr[i]);
    }
    return 0;
}

打印的结果是:
&arr[0] = 0x16fdff1b0
&arr[1] = 0x16fdff1b4
&arr[2] = 0x16fdff1b8
&arr[3] = 0x16fdff1bc
&arr[4] = 0x16fdff1c0
&arr[5] = 0x16fdff1c4
&arr[6] = 0x16fdff1c8
&arr[7] = 0x16fdff1cc
&arr[8] = 0x16fdff1d0
&arr[9] = 0x16fdff1d4

通过上面的结果得知,数组在内存中连续存放。


二维数组的创建和初始化

二维数组的创建:

1
2
3
int arr[3][4];//创建一个三行四列的数组
char arr[3][5];
double arr[2][4];

二维数组的初始化:

1
2
int arr[3][4] = {1,2,3,4,5};//第一行存不下就去第二行
int arr[3][4] = {{1,2,3},{4,5}};//第一行放1,2,3,0,第二行放4,5,0,0,第三行全是0

二维数组不完全初始化,后面的值默认是0。
int arr[][] = {1,2,3,4,5,6,7,8};
上面的写法是错误的,列不能省略,行可以。
int arr[3][] = {{1,2,3,4},{5,6,7,8}};
上面的写法是错误的,列不能省略,行可以。
int arr[][4] = {{1,2,3,4},{5,6,7,8}};
上面的写法是可以的,行可以省略。

二维数组的使用:

二维数组通过下标使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main() {
    int arr[3][4] = {{1,2,3},{4,5}};//创建一个三行四列的数组
    int i = 0;
    for (i = 0; i<3; i++) {
        int j = 0;
        for (j=0; j<4;j++) {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

打印的结果是:
1 2 3 0 
4 5 0 0 
0 0 0 0

二维数组在内存中的存储

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main() {
    int arr[3][4] = {{1,2,3},{4,5}};//创建一个三行四列的数组
    int i = 0;
    for (i = 0; i<3; i++) {
        int j = 0;
        for (j=0; j<4;j++) {
            printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
        }
    }
    return 0;
}

打印的结果是:
&arr[0][0] = 0x16fdff278
&arr[0][1] = 0x16fdff27c
&arr[0][2] = 0x16fdff280
&arr[0][3] = 0x16fdff284
&arr[1][0] = 0x16fdff288
&arr[1][1] = 0x16fdff28c
&arr[1][2] = 0x16fdff290
&arr[1][3] = 0x16fdff294
&arr[2][0] = 0x16fdff298
&arr[2][1] = 0x16fdff29c
&arr[2][2] = 0x16fdff2a0
&arr[2][3] = 0x16fdff2a4

二维数组和一维数组一样,也是连续的。


数组一是用来存储数据,二是用来传递参数。

数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。

冒泡排序

假设一组数据:10,9,8,7,6,5,4,3,2,1(10和9比较)
比较一次:9,10,8,7,6,5,4,3,2,1(10和8比较)
比较两次:9,8,10,7,6,5,4,3,2,1
比较三次:9,8,7,10,6,5,4,3,2,1
……
9,8,7,6,5,4,3,2,1,10

上面的一趟冒泡排序让10回到了最终位置,下面可以对其他数字冒泡排序。
9,8,7,6,5,4,3,2,1,10
8,9,7,6,5,4,3,2,1,10
8,7,9,6,5,4,3,2,1,10
……
8,7,6,5,4,3,2,1,9,10
对每个数字进行冒泡排序,最终效果
……
1,2,3,4,5,6,7,8,9,10

10个元素进行冒泡排序,需要进行9趟(n-1趟)

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
#include <stdio.h>
void bubble_sort(int arr[],int sz)//此时数组元素个数可以不指定
{
    //首先确定冒泡排序趟数
    int i = 0;
    //int sz = sizeof(arr)/sizeof(arr[0]);
    //不可以在这里计算数组个数,在主函数里计算,因为arr数组没有完全传过来,只传了arr首元素地址。
    for (i=0; i<sz; i++) {
        int flag = 1;//假设本次排序已经有序了
        //每一趟冒泡排序内容
        int j = 0;
        for (j = 0; j < sz - 1 - i ; j++) {
            if(arr[j] > arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = 0;//本次排序的数据不有序
            }
        }
        if (flag == 1) {
            break;//跳出冒泡排序循环
        }
    }
}

int main() {
    int arr[] = {912,813,713,226,235,4421,313,2131,144,1110};
    int sz = sizeof(arr)/sizeof(arr[0]);
    //对arr进行排序,升序。
    int i = 0;
    bubble_sort(arr,sz);//冒泡排序函数
    for (i = 0; i<sz; i++) {
        printf("%d ",arr[i]);
    }
    return 0;
}

break语句只用于for和switch循环。


数组名是什么?

——数组名是首元素地址(有2个例外)
1、sizeof内部单独放数组名
此时数组名表示整个数组,计算整个数组大小,单位是字节。
2、&arr,取地址数组名
数组名代表整个数组,取出的是整个数组的地址。