「C 语言」4 数组

数组

一维数组的创建与初始化

数组的创建

数组是一组相同类型元素的集合,数组的创建方式

type_t  arr_name  [const_n];
//type_t  是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

例子:

int arr[10];//放10个整型元素的数组

int n = 10;
int arr[n];//error - n应该是一个常量

float arr2[4];
double arr3[20];

数组的初始化

在创建数组的同时给数组内容一些合理的初始值(初始化)

int arr1[10] = {1,2,3};//不完全初始化 - 后面默认初始化为 0
int arr2[] = {1,2,3,4};
int arr3[5]  = {1,2,3,4,5};//完全初始化
char arr4[3] = {'a',98,'c'};//可以有ascii码
char arr5[] = {'a','b','c'};
char arr6[10] = "abcdef";//abcdef\0
char arr7[] = "abc";//未指定大小必须初始化 有\0

printf("%d\n",sizeof(arr7);//7
printf("%d\n",strlen(arr7));//6

一维数组的使用

  • 数组使用下标来进行访问,下标从0开始
  • 数组的大小通过计算得到
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

数组的访问

#include<stdio.h>

int main()
{
    char arr[] = "abcdef";
    for (int i=0;i<(int)strlen(arr);i++)
        printf("%c\n",arr[i]);
    return 0;
}

一维数组在内存中的存储

#include<stdio.h>

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

数组在内存中是连续存放的

二维数组的创建与初始化

二维数组的创建

//数组创建
int arr[3][4];
char[3][5];

二维数组的初始化

//数组初始化
int arr[3][4] = {1,2,3,4};
int arr[4][4] = {{1,2,3},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组的列不能省略

二维数组的使用

行和列的标号都是从0开始的

int arr[3][4] = {{1,2,3},{4,5}};
for (int i=0;i<3;i++)
{
    for (int j=0;j<4;j++)
        printf("%d ",arr[i][j]);
    printf("\n");
}

二维数组在内存中的存储

按行直接展开连续填充

数组作为函数参数

数组在传参时,传入的是数组首元素的地址

以冒泡排序为例

#include<stdio.h>

void bubble_sort(int arr[], int sz)
{
    int flag = 1;//假设这一趟数据已经有序
    //确定趟数
    for (int i=0;i<sz-1;i++)
    {
        for (int j=0;j<sz-i-1;j++)
        {
            if (arr[j]>arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                flag = 0;//本趟排序不完全有序
            }
        }
        if(flag==1)
            break;
    }
}

int main()
{
    int arr[] = {9,8,7,6,5,4,3,2,1,0};
    int sz = sizeof(arr)/sizeof(arr[0]);
    //对arr进行排序
    bubble_sort(arr,sz);
    for (int i=0;i<sz;i++)
        printf("%d ",arr[i]);
    return 0;
}

数组名是什么?

#include<stdio.h>

int main()
{
    int arr[] = {1,2,3,4,5};
    printf("%p\n",arr);
    printf("%p\n",&arr[0]);
    //二者等价
    printf("%d\n",*arr);//1
    return 0;
}

数组名是数组首元素的地址有两个例外

#include<stdio.h>

int main()
{
    int arr[] = {1,2,3,4,5,6};
    int sz = sizeof(arr)/sizeof(arr[0]);
    //sizeof(arr_name) - 计算的是整个数组的大小
    printf("%p\n",&arr);//数组的地址 - 和&arr[0]不同
    printf("%p\n",&arr+1);//这和&arr[0]+1不同
    //&arr_name - 取出的时整个数组的地址
    return 0;
}

数组的地址数组首元素的地址意义不同

&arr 和 &arr[0] 表现一样 &arr+1 和 &arr[0]+1 表现不一样

应用实例

  1. 三子棋(tic-tac-toe)

  2. 扫雷(Minesweeper)

#C #笔记
0%