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限定后只能读不能写)



相关文章
|
16天前
|
存储 编译器 C语言
C语言之数组
C语言之数组
24 0
|
17天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
2月前
|
C语言
在C语言中数组作为函数参数的应用与示例
在C语言中数组作为函数参数的应用与示例
17 0
|
2月前
|
C语言
【进阶C语言】数组笔试题解析
【进阶C语言】数组笔试题解析
21 0
|
6天前
|
机器学习/深度学习 C语言
C语言三维数组的创建
该代码片段展示了如何在C语言中创建一个动态的3D数组。由于`n`在编译时未知,不能直接声明为`int f[n][n][n]`。正确的方法是使用`malloc`进行动态内存分配。首先分配`n`个`int **`,然后对每一层分配`n`个`int *`,最后每个元素分配`n`个`int`。之后可以使用这个3D数组,并在完成后正确释放内存。
|
17天前
|
C语言
数组深入剖析(C语言基础入门)
数组深入剖析(C语言基础入门)
|
19天前
|
存储 C语言
C语言中字符串的引用与数组元素操作
C语言中字符串的引用与数组元素操作
21 0
|
1月前
|
存储 人工智能 程序员
爱上C语言:超详细讲解数组,学数组看这一篇就够了(数组篇)
爱上C语言:超详细讲解数组,学数组看这一篇就够了(数组篇)
|
1月前
|
编译器 程序员 C语言
【C语言】变长数组,二分查找和数组之间自动替换的实现
【C语言】变长数组,二分查找和数组之间自动替换的实现
|
1月前
|
存储 C语言
【C语言数组】创建、初始化、以及使用2
【C语言数组】创建、初始化、以及使用