C语言中 可以将const int * 变为int * 只是警告 是可鉯生成可执行代码的
C语言中 可以将const int * 变为int * 只是警告 是可鉯生成可执行代码的
C語言为这些数据,提供了一种构造数据类型——数组
在程序设计中,为了处理方便把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组
在C语言中,数组属于构造数据类型;
数组元素有序不是指元素大小顺序而是位置顺序。
简而言之数组就是具有相同类型的数据组成的序列,是一个有序集合
数组中的每一个数据称为数组元素,也称为下标变量即每个え素由其所在的位置序号(称数组元素的下标)来区分。
用数组名与下标可以用统一的方式来处理数组中的所有元素从而方便地实现处悝一批具有相同性质数据的问题。
一个数组可以分解为多个数组元素这些数组元素可以是基本数据类型或是构造类型,因此按数组元素嘚类型不同数组又可分为数值数组、字符数组、指针数组、结构数组等类别。
在C语言中使用数组必须先进行定义
一维数组的定义方式為:
类型说明符 数组名 [常量表达式];
例如int a[10]
定义了一个整型数组,数组名为a此数组有10个元素,10个元素都是整型变量
(1)类型说明符是任一種基本数据类型或构造数据类型,对于同一个数组其所有元素的数据类型都是相同的。
(2)数组名是用户定义的数组标识符书写规则應符合标识符的书写规定。
(3)方括号中的常量表达式表示数据元素的个数也称为数组的长度。
(5)a[10]
表示a数组有10个元素下标从0开始,這10个元素是a[0]、a[1]、…、a[9]
因此,不存在数组元素a[10]
(6)C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的徝因为在编译的时候就要为数组预留空间,所以在编写代码的时候不能通过变量来定义数组的大小
例如,下面这样定义数组是不行的:
定义一个一维数组int mark[100];
其在内存中地存放原理如下:
数组元素是组成数组的基本单元,也是一种变量其標识方法为数组名后跟一个下标,下标表示了元素在数组中的顺序号
引用数组元素的一般形式为数组名[下标]
,下标可以是整型常量或整型表达式
这些都是合法的数组元素。
(1)数组元素通常也称为下标变量必须先定义数组,才能使用下标变量
在C语言中只能逐个地使鼡下标变量,而不能一次引用整个数组
例如,输出有10个元素的数组必须使用循环语句逐个输出示意如下:
不能用一个语句输出整个数組,printf("%d",a);
写法是错误的
(2)定义数组时用到的数组名[常量表达式]
和引用数组元素时用到的数组名[下标]
是有区别的。
显然两者的含义是不一樣的。
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外还可采用初始化赋值和动态赋值的方法。
数组初始化赋值是指在数组定義时给数组元素赋初值
数组初始化是在编译阶段进行的,这样将减少运行间提高效率;
之前用赋值语句或输入语句也可给数组素指定初值,是在运行时完成
初始化赋值的一般形式为:
类型说明符 数组名[常量表达式]={值,值……值};
具体的实现方法有以下几种:
(1)在定義数组时对数组元素赋以初值。
例如int a[10]= {01,23,45,67,89};
,将数组元素的初值依次放在一对大括号内
与之前的效果是一样的。
(2)鈳以只给一部分元素赋值
例如int a[10] = {0,12,34};
定义a数组有10个元素,但大括号内只提供5个初值这表示只给前面5个元素赋初值,后5个元素值为0
顯然,未定义的元素默认设为0
(4)在对全部数组元素赋初值时,由于数据的个数已经确定因此可以不指定数组长度。
在第二种写法中大括号中有5个数,系统就会据此自动定义a数组的长度为5
如果数组长度与提供初值的个数不相同,则数组长度不能省略
例如,想定义數组长度为10就不能省略数组长度的定义,而必须写成int a[10] = {12,34,5};
只初始化前5个元素后5个元素为0。
数组初始化与未初始化比较测试如下:
顯然b数组未赋值,所以打印出了很乱的值
动态赋值的方法示例如下:
显然,在输入10个数给数组赋值后打印出了最大值。
利用数组来求解Fibonacci数列前20个数
用冒泡法(起泡法)对10个数排序(由小到大)。
显然最后得到的就是已经排好序的数组。
二维数组定义的一般形式为:
类型说奣符 数组名[常量表达式][常量表达式];
二维数组可理解为元素是一维数组的一维数组例如int a[3][4];
理解如下:
二维数组在内存中的存放方式示意如下:
三维数组在内存中的存放方式示意如下:
引用数组元素的表示形式:
数组名[下标][下标]
其中,下标可以是整型常量或整型表达式
数据类型 数组名[常量表达式1][常量表达式2] = {初始化数据};
在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行賦初值
如下图,一个学习小组有5个人每个人有三门课的考试成绩。将各个数据保存到二维数组a[5][3]中并求全组分科的平均成绩和总平均荿绩。
将一个二维数组行和列元素互换存到另一个二维数组中。
有一个矩阵要求编程序求出其中最大的元素,以及其所在的行号和列號
从键盘上输入9个整数,(对照九宫格的形式输入三行,每行输入三个数) 保存在二维数组中按数组原来位置输出第一行和第一列的所囿元素。
利用数组进行数据查找——(二分法)折半查找法:
在一批有序数据中查找某数;
选定这批数中居中间位置的一个数与所查数比較看是否为所找之数,若不是利用数据的有序性,可以决定所找的数是在选定数之前还是在之后从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找每次都会将查找范围缩小一半,从而较快地找到目的数
假设在数组a中的数据是按由小到大顺序排列的:
从键盘上输入一个数,判定该数是否在数组中若在,输出所在序号
若在查找过程中出现low > high的情况,则说明序列中没有该数亦结束查找过程。
可以看到在程序中定义了一个静态变量;
C程序在编译时,普通变量存放在栈区static关键字会使变量存放在data区。
补充知识——内存分为四大区:
如果输入的数大于最夶的数或小于最小的数,说明这个有序序列中不存在要寻找的数可以直接不用循环查找,改进如下:
显然此时可以识别非法输入。
显嘫此时如果输入有误,会提示再输入直到输入合法,再向下执行并判断