【C语言基础考研向】09 一维数组

简介: 数组是一种有序集合,用于存储相同类型的数据,便于统一操作与管理。例如,将衣柜底层划分为10个格子存放鞋子,便于快速定位。在C语言中,数组定义格式为 `类型说明符数组名[常量表达式];`,如 `int a[10];` 表示定义了一个包含10个整数的数组。数组初始化时可以直接赋值,也可以部分赋值,且数组长度必须固定。数组在内存中连续存储,访问时需注意下标范围,避免越界导致数据异常。数组作为参数传递时,传递的是首地址,修改会影响原数组。

1 数组的定义

为了存放鞋子,假设你把衣柜最下面的一层分成了 10 个连续的格子。此时,让他人帮你拿
鞋子就会很方便,例如你可直接告诉他拿衣柜最下面一层第三个格子中的鞋子。同样假设现在我
们有 10 个整数存储在内存中,为方便存取,我们可以借助 C 语言提供的数组,通过一个符号来
访问多个元素。

某班学生的学习成绩、一行文字、一个矩阵等数据的特点如下:
(1)具有相同的数据类型.
(2)使用过程中需要保留原始数据.

C语言为了方便操作这些数据,提供了一种构造数据类型——数组.所谓数组,是指一组具有相同数据类型的数据的有序集合.
一维数组的定义格式为:

类型说明符数组名[常量表达式];

例如:

int a[10];

定义一个整型数组,数组名为a,它有10个元素。
声明数组时要遵循以下规则:
(1)数组名的命名规则和变量名的相同,即遵循标识符命名规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度.
(3)常量表达式中可以包含常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值.
以下是错误的声明示例(最新的C标准支持,但是最好不要这么写):

int n;
scanf("%d", &n);/*在程序中临时输入数组的大小*/int a[nl;

数组声明的其他常见错误如下:

float a[0;        /*数组大小为О没有意义*/
int b(2)(3);     /*不能使用圆括号*/
3int k=3, a[kl; /*不能用变量说明数组大小*/

2.一维数组在内存中的存储

语句int mark[100};定义的一维数组 mark在内存中的存放情况如下图所示,每个元素都是
整型元素,占用4字节,数组元素的引用方式是“数组名[下标]",所以访问数组mark 中的元素的方式是 mark[0],mark[1]..,mark[99].注意,没有元素mark[100],因为数组元素是从03开始编号的.

下面介绍一维数组的初始化方法.

(1)在定义数组时对数组元素赋初值.例如,

int a[10]={
   0,1,2,3,4,5,6,7,8,9l;

不能写成

inta[ a[10]={
   0,1,2,3,4,5,6,7,8,9l;

(2)可以只给一部分元素赋值.例如,

int a[10]-{
   0,1,2,3,4};

定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前5个元素赋初值,后5个元素的值为0.

(3)如果要使一个数组中全部元素的值为0,那么可以写为

int a[10]={
   0,0,0,0,0,0,0,0,0,0}int a[10]={
   0};

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度.例如,

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

3.数组的访问越界

下面借助一个数组的实例来掌握数组元素的赋值、访问越界.下例中给出了该例的全部代码.
【例】一维数组的存储及访问越界.

#finclude <stdlo.h
//数组越界
int main()
{
   
    int a[5]={
   1,2,3,4,5};//定义数组时,数组长度必须固定
    int j=20;
    int i=10;
    a[5]=6;//越界访问
    a[6]=7;//越界访问会造成数据异常
    printf("i=%d\n"",i);//i发生改变
    return 0;
}

数组另一个值得关注的地方是,编译器并不检查程序对数组下标的引用是否在数组的合法范围内.这种不加检查的行为有好处也有坏处,好处是不需要浪费时间对有些已知正确的数组下标进行检查,坏处是这样做将无法检测出无效的下标引用.一个良好的经验法则是:如果下标值是通过那些已知正确的值计算得来的,那么就无须检查;如果下标值是由用户输入的数据产生的,那么在使用它们之前就必须进行检查,以确保它们位于有效范围内.


4.数组的传递

#include <stdio.h>
//一维数组的传递,数组长度无法传递给子函数//C语言的函数调用方式是值传递
vold print(int b[],int len)
{
   
    int i;
    for(i=O;i<len;i++)
    {
   
        printf("%3d",b[i]);
    }
    b[4]=20;//在子函数中修改数组元素
    printf( "\n");
}
//数组越界
//一维数组的传递
#define N 5
int main()
{
   
    int a[5]={
   1,2,3,4,5};//定义数组时,数组长度必须固定print(a,5);
    printf("e[4]=%d\n",a[4]);//a[4]发生改变
    return 0;
}

进入print函数,这时会发现数组b的大小变为8字节,==这是因为一维数组在传递时,其长度是传递不过去的,所以我们通过len来传递数组中的元素个数==.实际数组名中存储的是数组的首地址,在调用函数传递时,是将数组的首地址给了变量b (其实变量b是指针类型,具体原理会在指针节讲解),在b[的方括号中填写任何数字都是没有意义的。这时我们在print 函数内修改元素b[4]=20,可以看到数组b的起始地址和 main 函数中数组a的起始地址相同,即二者在内存中位于同一位置,当函数执行结束时,数组a中的元素a[4]就得到了修改.

相关文章
|
2月前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
88 4
|
20天前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
63 6
|
23天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
44 5
|
23天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
27天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
27天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
2月前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
55 6
|
2月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
2月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
下一篇
DataWorks