C语言入门——数组

目录

一、一维数组的创建和初始化

1、数组的创建

2、数组的初始化

二、一维数组的使用

三、一维数组在内存中的存储

四、二维数组的创建和初始化

1、二维数组的创建

2、二维数组的初始化

五、二维数组的使用

六、二维数组在内存中的存储

七、数组作为函数参数:冒泡排序为例

八、数组的应用实例1:三子棋

九、数组的应用实例2:扫雷游戏


一、一维数组的创建和初始化

1、数组的创建

●数组是一组相同类型元素的集合。

●创建方式:

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

●创建实例:[]中要给一个常量才可以,不能使用变量。

//1
int arr[10];

//2
int count=10;
int arr2[count];  //报错!

//3
char arr3[10];
float arr4[1];
double arr5[20];

2、数组的初始化

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

●例:

int arr1[10]={1,2,3,4,5,6,7,8,9,10};  //完全初始化
int arr2[10]={1,2,3,4,5};   //不完全初始化
char ch1[3]={'a','b','c'};
char ch2[3]="bit";

二、一维数组的使用

●下标引用操作符:[]。下标从0开始。

●数组的大小可以通过计算得到:

int arr[10];
int sz=sizeof(arr)/sizeof(arr[0]);

三、一维数组在内存中的存储

1、一维数组在内存中是连续存放的。

 2、随着数组下标的增长,地址由低到高变化。

证明:

//1
int main()
{
    int arr[10]={0};
    int i=0;
    for(i=0;i<10;1++)
    { 
       printf("&arr[%d]=%p\n",i,&arr[i]);  //%p:打印地址
    }
    return 0;
}
//2
int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    int* p=arr;
    int i=0;
    for(i=0;i<10;i++)
    {
        printf("%d ",*p);
        p++;
    }
    return 0;
}

四、二维数组的创建和初始化

1、二维数组的创建

int arr1[3][4];
char arr2[3][5];
double arr3[2][4];

2、二维数组的初始化

int arr[3][4]={1,2,3,4}; //不完全初始化,后面补0
int arr[3][4]={{1,2},{4,5}}; 
int arr[][4]={{2,3},{4,5}};  //行可以省略,列数不可以省略

五、二维数组的使用

二维数组的使用也是通过下标的方式。

//打印一个二维数组的所有元素
int main()
{
    int arr[][4]={{1,2},{3,4},{4,5}};
    for(int i=0;i<3;i++)
    {
       for(int j=0;j<4;j++)
       {
          printf("%d ",arr[i][j]);
       }
       printf("\n");
    }
}

六、二维数组在内存中的存储

二维数组在内存中也是连续存放的。

一行内部连续,跨行也是连续的。

 证明:

int main()
{
    int arr[][4]={{1,2},{3,4},{4,5}};
    for(int i=0;i<3;i++)
    {
       for(int j=0;j<4;j++)
       {
          printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]); //将每个元素的地址打印出来
       }
       printf("\n");
    }
}

七、数组作为函数参数:冒泡排序为例

数组名是首元素的地址。

两个特例:

●sizeof(数组名):数组名表示整个数组,计算的是整个数组的大小,单位是字节

●&数组名:数组名表示整个数组,取出的是整个数组的地址

void bubble_sort(int arr[],int sz)  //这里的形参arr实际上是一个指针
{
     int i=0;
     for(i=0;i<sz-1;i++)
     {
         int j=0;
         for(j=0;j<sz-1-i;j++)
         {
             if(arr[j]>arr[j+1])
             {
                   int tmp=arr[j];
                   arr[j]=arr[j+1];
                   arr[j+1]=tmp;
             }
         }
     }
}
int main()
{
    int arr[]={9,8,7,6,5,4,3,2,1,0};
    int sz=sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr,sz);
    return 0;
}

八、数组的应用实例1:三子棋

test.c:测试游戏的逻辑

game.h:关于游戏相关的函数声明,符号声明,头文件的包含

game.c:游戏相关函数的实现

//game.h头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//符号的定义
#define ROW 3
#define COL 3
//函数的声明
void InitBoard(char board[ROW][COL],int row,int col);     //初始化棋盘
void DisplayBoard(char board[ROW][COL],int row,int col);  //打印棋盘
void PlayerMove(char board[ROW][COL],int row,int col);    //玩家下棋
void ComputerMove(char board[ROW][COL],int row,int col);  //电脑下棋
char IsWin(char board[ROW][COL],int row,int col);   //判断游戏输赢  //玩家赢了:*,电脑赢了:#,平局:Q,游戏继续:C
//test.c
#include<stdio.h>
#include"game.h"
void menu()
{ 
     printf("*****************************\n");
     printf("*******    1.play    ********\n");
     printf("*******    2.exit    ********\n");
     printf("*****************************\n");
}
void game()
{
     //用二维数组存储数据
     char board[ROW][COL];
     //初始化棋盘
     Initboard(board,ROW,COL);
     //打印棋盘
     DisplayBoard(board,ROW,COL);
     char ret=0;
     //下棋
     while(1)
     {
        //玩家下棋
        PlayerMove(board,ROW,COL);
        DisplayBoard(board,ROW,COL); 
        //判断玩家是否赢得游戏
        ret=IsWin(board,ROW,COL);
        if(ret!='C')
        {
            break;
        }
        //电脑下棋
        ComputerMove(board,ROW,COL);
        DisplayBoard(board,ROW,COL); 
        //判断电脑是否赢得游戏
        ret=IsWin(board,ROW,COL);
        if(ret!='C')
        {
            break;
        }
     }
     if(ret='*')
     {
        printf("玩家赢了\n");
     }
     else if(ret='#')
     {    
        printf("电脑赢了\n");
     } 
     else
     {
        printf("平局\n");
     }
     DisplayBoard(board,ROW,COL); 
}
int  main()
{
     int input=0;
     srand((unsigned int)time(NULL));
     do
     {
        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch(input)
        {
           case 0:
               printf("三子棋游戏!\n");
               game();
               break;
           case 1:
               printf("退出游戏!\n");
               break;
           default:
               printf("选择错误,请重新选择!\n");
               break;
        }
     }while(input);
     return 0;
}
//game.c
#include "game.h"
void InitBoard(char board[ROW][COL],int row,int col)
{
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            board[i][j]=' ';
        }
    }    
}
void DisplayBoard(char board[ROW][COL],int row,int col)
{
     for(int i=0;i<row;i++)
     {
         for(int j=0;j<col;j++)
         {
             printf(" %c ",board[i][j]);
             printf("|");
         }
         if(i<row-1)
         {
            for(int k=0;k<col;k++)
            {
                 printf("---");
                 if(j<col-1)
                 {
                    printf("|");
                 }
            }
            printf("\n")
         }
     }
}
void PlayerMove(char board[ROW][COL],int row,int col)
{
     int x=0,y=0;
     printf("玩家走:>\n");
     while(1)
     {
        printf("请输入下棋的坐标:>\n");
        scanf("%d %d",&x,&y);
        if(x>=1&&x<row&&y>=1&&y<=col) 
        {
            //下棋
            if(board[x-1][y-1]==' ')     //判断坐标是否被占用
            {
               board[x-1][y-1]='*';
               break;
            }
            else
            {  
               printf("坐标被占用,请重新输入!\n");
            }
        }
        else
        {
           printf("坐标非法,请重新输入!\n");
        }
     }
}
void ComputerMove(char board[ROW][COL],int row,int col); 
{
     printf("电脑走:>);
     while(1)
     {
        int x=rand()%row;
        int y=rand()%col;
        if(board[x][y]==' ')    //判断占用
        {
           board[x][y]='#';
           break;
        }       
     }
}
int IsFull(char board[ROW][COL],int row,int col)
{
    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            if(board[i][j]==' ')
            { 
               return 0;
            }
        }
    }
    return 1;
}
char IsWin(char board[ROW][COL],int row,int col)
{
     int i=0;
     //判断三行
     for(i=0;i<row;i++)
     {
         if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
         {
             return board[i][1];
         }
     }
     //判断三列
     for(i=0;i<col;i++)
     {
         if(board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[0][i]!=' ')
         {
             return board[0][i];
         }
     }
     //判断对角线
     if(board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')
     {
         return board[1][1];
     }
     if(board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[1][1]!=' ')
     {
         return board[1][1];
     }
     //判断平局    
     int ret=IsFull(board,row,col);
     if(ret==1) return 'Q';
     return 'C';
}

九、数组的应用实例2:扫雷游戏

test.c:扫雷游戏的测试

game.c:游戏的函数实现

game.h:头文件,游戏的函数声明

●写两个数组:1个char数组存放布置好雷的信息,1个char数组存放排查出的雷的信息

●如果想实现9*9的棋盘,数组的大小设计成11*11比较好

//game.h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define EASY_COUNT 10
#define ROWS ROW+2
#define COLS COL+2

//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col);
//布置雷
void SetMine(char board[ROWS][COLS],int row,int col);
//排查雷
void FindMine(char mine[ROWS][COLS],char shwo[ROWS][COLS],int row,int col);
//test.c
#include"game.h"
void menu()
{ 
     printf("*****************************\n");
     printf("*******    1.play    ********\n");
     printf("*******    2.exit    ********\n");
     printf("*****************************\n");
}
void game()
{
     char mine[11][11];  //存放布置好的雷的信息
     char show[11][11];  //存放排查出来的雷的信息
     //初始化棋盘
     InitBoard(mine,ROWS,COLS,'0'); 
     InitBoard(show,ROWS,COLS,'*');
     //打印棋盘
     DisplayBoard(show,ROW,COL);
     //布置雷
     SetMine(mine,ROW,COL);
     //排查雷
     FindMine(mine,show,ROW,COL);
}
int main()
{ 
    int input=0;
    srand((unsigned int)time(NULL));
    do
    {
       menu();
       printf("请选择:>");
       scanf("%d",&input);
       switch(input)
       {
           case 1:
              game();  //扫雷游戏
              break;
           case 0:
              printf("退出游戏\n");
              break;
           default:
              printf("选择错误,请重新选择!\n");
              break;
       }
    }while();
    return 0;
}
//game.c
#include"game.h"
int get_mine_count(char board[ROWS][COLS],int x,int y)
{
    return mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+mine[x][y-1]+mine[x][y+1]+mine[x+1][y+1]+mine[x+1][y]+mine[x+1][y-1]-8*'0';
}
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
     for(int i=0;i<rows;i++)
     {
         for(int j=0;j<cols;j++)
         {
             board[i][j]=set;
         }
     }
}
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
     printf("----------扫雷游戏----------");
     int i=0;
     //打印列号
     for(i=0;i<=col;i++)
     {
         printf("%d ",i);
     }
     printf("\n");
     for(i=0;i<row;i++)
     {
         printf("%d ",i);
         for(int j=0;j<col;j++)
         {
             
             printf("%c ",board[i][j]);
         }
         printf("\n");
     }
     printf("----------扫雷游戏----------");
}
void SetMine(char board[ROWS][COLS],int row,int col)
{
     int count=EASY_COUNT;
     while(count)
     {
         int x=rand()%row+1;
         int y=rand()%col+1; 
         if(mine[x][y]=='0')
         { 
            mine[x][y]='1';
            count--;
         }
     }
}
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
     //1、输入要排查的坐标
     //2、检查坐标是不是雷
     int x=0;
     int y=0;
     int win=0;
     while(win<row*col-EASY_COUNT)
     {
         printf("请输入要排查的坐标:>\n");  
         scanf("%d %d",&x,&y);
         if(x>=1&&x<=row&&y>=1&&y<=col)
         {
            if(mine[x][y]=='1')
            {
               printf("很遗憾,你被炸死了");
               DisplayBoard(mine,row,col);
               break;
            }
            else
            {
               int count=get_mine_count(mine,x,y);
               show[x][y]=count+'0';
               DisplayBoard(show,row,col);
               win++;
            }  
         }
         else
         {
            printf("坐标不合法,请重新输入\n"); 
         }
     }
}

回答: 在C语言中,数组的默认值取决于数组的声明位置和是否进行了显式的初始化。如果数组是在文件范围内声明的(在任何函数之外)或者声明为static,并且没有显式的初始化程序,则数组的内容将被初始化为0。如果数组是在块范围内(在函数或块内)声明的,并且未声明为static,并且没有显式的初始化程序,则数组的内容是不确定的(本质上是垃圾值,其中一些可能是陷阱表示)。如果数组已被显式初始化,则它包含初始化程序中的所有内容。\[2\]所以在C语言中,如果没有显式地初始化数组,那么数组的默认值将是0或者是垃圾值。 #### 引用[.reference_title] - *1* *3* [C语言数组的定义及其使用方法](https://blog.csdn.net/m0_64365419/article/details/125029816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [char数组的默认值](https://blog.csdn.net/m0_60525421/article/details/123169650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趣多多代言人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值