C语言数组基础

简介: C语言数组基础

文章目录


一维数组


二维数组(多维数组)


一维数组



数组由数据类型相同的一系列元素组成,普通变量能使用的类型,数组元素都可以使用


数组声明


int a[10];//包含10个int类型元素的数组
char b[10];//包含10个字符型元素的数组
float c[10];//包含10个float类型元素的数组


方括号[]表示a,b,c都是数组,方括号中的数字表示数组中的元素个数

要访问数组中的元素,通过使用数组下标(索引)来定位数组中的元素,数组的下标是从0开始的,切记a[0];就表示数组a中的第一个元素a[9];表示最后一个元素


数组初始化


int a[4]={1,3,45,7};


花括号括起来用逗号分隔数组元素,注意不支持ANSI的编译器会报错,这时在数组声明前加上关键字 static 可以解决这个问题


使用数组打印每月的天数(包含了数组的定义初始化和使用以及define宏定义和for循环等内容)


#include<stdio.h>
#define MONTHS 12
int main(void){
    int days[MONTHS] = {31,29,31,30,31,30,31,31,30,31,30,31};
    for(int i = 0;i<MONTHS;i++)
    printf("%d  Month  have  %d  days\n",i+1,days[i]);
    return 0;
}

20210713183218432.png


使用const声明只读数组


const int days[MONTHS] = {……};


声明为const便不能再给它赋值,只能读数据,不能写数据


未初始化的数组元素


对于没有进行初始化的元素,编译器会做怎样的处理呢,写代码运行看一下


#include<stdio.h>
#define SIZE 4
int main(){
    int a[SIZE] = {1,2};
    for (int i = 0; i < SIZE; i++)
    {
        printf("%d  %d\n",i,a[i]);
    }
    return 0;
}


好,🆗看到编译器把我未初始化元素的值都置为了0(垃圾值(小🐂🐎))


20210713184328427.png


初始化列表的个数多余数组元素的个数时


C会把它视为错误❌,这叫做数组下标越界,其实我们也可以省略掉数组的个数不写,编译器会自己根据列表中的项数来确定数组的大小


int a[] = {3,45,67,789,0,12};


sizeof计算数组大小元素个数


#include<stdio.h>
int main(){
    int a[] = {12,45,67,3,0,1};
    printf("%d\n",sizeof a);
    printf("%d\n",sizeof a[2]);
    printf("%d\n",sizeof a[5]);
    return 0;
}


int类型数组一个占用4字节,sizeof a返回了24字节,可知该数组有6个元素,一个元素占用4个字节


2021071318555653.png


指定初始化器(C99)


C99新增一个新特性:指定初始化,从字面就可以看出来该特性可以初始化指定的数组元素


//传统的
int a[5] = {2,5,0,13,14};
//新特性
int a[5] = {2,0,[5]=5};
#include<stdio.h>
int main(){
    int a[6] = {2,0,[5]=5};
    for(int i=0;i<6;i++)
    printf("%d    %d\n",i,a[i]);
    return 0;
}


使用指定初始化器,猜猜结果会输出什么东东


20210713204848354.png


给数组元素赋值


声明数组后,可以借助数组下标(索引)对数组元素进行赋值操作,比如:


/*给数组元素进行赋值*/
#include<stdio.h>
#define SIZE 20
int main(){
    int i,number[SIZE];
    for(i=0;i<SIZE;i++)
    {
        number[i] = 2*i;
        printf("%d    %d\n",i,number[i]); 
    }
    return 0;
}


使用了循环给数组的元素一次赋值,C中不允许把数组赋值给数组,除了初始化以外也不允许使用花括号列表的形式赋值。


//无效的数组赋值
int a[4] = {5,2,0,1};
int b[4];
b=a;//这是不被允许的
a[4]=b[5];//下标越界
a[4] = {23,45,67,8};//不起作用


数组边界


在使用数组时,要防止数组下标超过边界。(必须确保下标是一个有效的值)


编译器不会检查数组下标是否使用得当,程序可以运行,但结果可能不尽人意,或者异常终止


为什么C语言不对数组下标进行检查?

好问题,这要归功于C对程序员的信任,不检查边界,使得C程序运行更快一步


我们要记住:数组的下标是从0开始编号,最好在声明数组时使用宏定义来定义数组的大小


指定数组的大小


#define SIZE 4
int a = 5;
int b[SIZE];√//整数符号常量
int a1[3];//整数字面常量
int a2[1+1];//√
float a3[sizeof(int)+2];//√
float a4[-1];//×,数组大小必须大于0
float a5[0];//×,数组大小必须大于0
float a6[2.6];//×,数组大小必须是整数
float a7[(int)2.6];//√,已经强制转换成整数
char a8[a];//C99之前不允许


二维数组(多维数组)


初始化二维数组


#define YEAR 3//行
#define MONTH 12//列
const int a[YEAR][MONTH] = 
{
{34,45,23,1,23,34,67,87,90,56,6,7},
{1,23,45,67,78,89,90,34,54,63,67,8},
{1,2,3,4,5,6,7,8,9,10,11,12}
};


因为储存的值不想被改动,所以使用const关键字(被const限定后只能读不能写)



相关文章
|
26天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
35 6
|
29天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
1月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
17 0
保姆式教学C语言——数组
|
1月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
24 1
|
1月前
|
C语言
顺序表数组法构建(C语言描述)
如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。
18 2
|
1月前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
1月前
|
C语言
C语言数组
C语言数组
17 0