05--数组(1)

基本概念

  • 逻辑:一次性定义多个相同类型的变量,并存储到一片连续的内存中
  • 语法:

数据类型 数组名字 [ 元素的数量 ] ; // 定义数组 数据类型

数组名字 [ 元素的数量 ] = { 元素1的值 , 元素2的值, ..... ,元素N的值};// 定义数组并进行初始化

整形数组的定义:

int  arr1 [5] ; 
int  arr2 [5] = {1 , 2 , 3 , 4 , 5}; 

 

  • 语法释义:
    • arr 是数组名,即这片连续内存的名称
    • [5] 代表这片连续内存总共分成5个相等的格子,每个格子称为数组的元素
    • int 代表每个元素的类型,也可以是任意基本类型,也可以是组合类型,甚至可以是数组

 

 

如何访问数组(赋值、取值):

  • 存储模式:一片连续的内存,按数据类型分割成若干相同大小的格子
  • 元素下标:从数组开头位置的偏移量 , 因此数组的下标就等于 偏移量

 

 

数组名[ 需要操作的元素下标 ] = 数据 ;   // 使用数据 给数组中某一个元素进行赋值
变量  = 数组名[ 需要操作的元素下标 ] ; // 使用数组中的某一个元素给 变量进行赋值

example:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int  arr  [5] = {1,2,3,4,5} ;

    arr[2] = 250 ; // 把数组中的第三个数据修改位 250 
    int tmp = arr[4] ;  // 把数组中的第五个数据取出来存放到 tmp 变量中
    int tmp1 = arr[5] ; // 【错误】 属于越界访问, 有可能造成段错误 

    // 如何遍历整个数组
    for (int i = 0; i < 5 ; i++)
    {
        printf("arr[%d]:%d\n" , i , arr[i]);
    }

    printf("tmp:%d tmp1:%d\n" , tmp , tmp1);
    
    return 0;
}
  • 初始化:在定义的时候赋值,称为初始化
    // 正常初始化
    int a[5] = {100,200,300,400,500};
    
    int a[5] = {100,200,300,400,500,600}; // 错误,越界了 , 编译器会直接丢弃越界部分
    int a[ ] = {100,200,300}; // OK,自动根据初始化列表分配数组元素个数 , 因此该数组的元素是 3个
    int a[5] = {100,200,300}; // OK,只初始化数组元素的一部分, 剩余未初始化的部分会自动初始化为 0 
    int a[5] ; // 定义了一个数组,但是没有做任何的初始化,因此数组中的值是不确定的
    int a[] ; // 错误, 数组在定义的时候必须确定他的大小

    总结:

    在定义数组时 ,数组的大小必须确定,确定数组大小的方法有两个:

  • 在[ ] 直接填写元素的个数
  • 没有在 [ ] 填写大小,但是通过初始化数据的量来决定

字符数组

  • 概念:专门存放字符的数组,称为字符数组
  • 初始化与元素引用:
    char s1[5] = {'a', 'b', 'c', 'd', 'e'};       // s1存放的是字符序列,非字符串
    char s2[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; // s2存放了一个【字符串】 ,
     加了一个结束符\0 
    
    char s[6] = {"abcde"}; // 使用字符串直接初始化字符数组 【字符串数组】
    char s[5] = {"abcde"}; //【字符数组】 结束符没有被存入数组
    char s[6] =  "abcde" ; // 大括号可以省略
    
    s[0] = 'A'; // 索引第一个元素,赋值为 'A'

    多维数组

  • 概念:若数组元素类型也是数组,则该数组称为多维数组
  • 示例:
    示列:
    int a[2][3];
    
    // 代码释义:
    // 1, a[2]   是数组的定义,表示该数组拥有两个元素  【明确数组名以及元素个数】
    // 2, int [3]是元素的类型,表示该数组元素是一个具有三个元素的整型数组

 

 如何对多为数组进行初始化:

类型  数组名 [第一维度][第二维度] = { {元素1} , {元素2} } ;
int  arr1 [2][3] = { { 3,4,5} , { 9,8,7 } } ; // 完全初始化
int  arr2 [2][3] = { { 3,4 } , { 9,8 } } ; // 不完全初始化
int  arr3 [2][3] = { 3,4,5,9,8,7  } ;

如何引用:

int  arr1 [2][3] = { { 3,4,5} , { 9,8,7 } } ; // 完全初始化
int  arr2 [2][3] = { { 3,4 } , { 9,8 } } ; // 不完全初始化
int  arr3 [2][3] = { 3,4,5,9,8,7  } ;

// [错误] "Hello"这是【一个参数】它只负责对arr4[0]进行赋值,因此lo\0 会被编译器丢弃
char arr4 [2][3] = {"Hello"} ; 

// 这里则把"Hello" 拆分成了6个参数单独对数组进行赋值
char arr5 [2][3] = {'H','e','l','l','o', '\0'} ; 

arr1[0][1] = 250 ; // 访问arr1 中的第0个元素 【里面】 的第1个元素
for (int i = 0; i < 2 ; i++)
{
    for (int j = 0; j < 3; j++)
    {
        printf("arr5[%d][%d]:%c\n" , i , j , arr5[i][j]);
    }
    
}

数组万能拆解法

  • 任意的数组,不管有多复杂,其定义都由两部分组成。
    • 第1部分:说明元素的类型,可以是任意的类型(除了函数)
    • 第2部分:说明数组名和元素个数
int   a[4];       // 第2部分:a[4]; 第1部分:int
int   b[3][4];    // 第2部分:b[3]; 第1部分:int [4]
int   c[2][3][4]; // 第2部分:c[2]; 第1部分:int [3][4]
int  *d[6];       // 第2部分:d[6]; 第1部分:int *
int (*e[7])(int, float); // 第2部分:e[7]; 第1部分:int (*)(int, float)
  • 注解:
    • 上述示例中,a[4]、b[3]、c[2]、d[6]、e[7]本质上并无区别,它们均是数组
    • 上述示例中,a[4]、b[3]、c[2]、d[6]、e[7]唯一的不同,是它们所存放的元素的不同
    • 第1部分的声明语句,如果由多个单词组成,C语言规定需要将其拆散写到第2部分的两边
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值