一维数组
一维数组的定义
定义一个一维数组的一般形式为:
存储类别 类型标识符 数组名标识符[ 常量表达式 ];
数组的定义有以下说明:
①存储类别说明数组的存储属性,即数组的作用域与生成期,可以是静态型(static)、自动型(auto)、及外部型(extern)。当使用自动型时可以省略;
②类型标识符说明数组的数据类型;
③数组名标识符即所定义的数组的名称,其命名规则相同。
④常量表达式是数组的元素个数,及数组长度,是一个整型常量表达式,可以是直接常量和符号常量,例如:
static int a [ 5 ];
表示定义了一个静态存储的整型类型,该数组名为a,共有5个元素,每个元素都可以作为整型变量来使用。
一维数组元素的引用
C语言中的数组名实质上是数组的首地址,是一个常量地址,不能对其进行赋值,因而不能利用数组名来整体引用一个数组,只能单个地使用数组元素。
引用的一般形式为:
数组名 [ 下标 ];
数组的下标是从0开始的。
例如:int a [ 5 ] ;
注意:int a [ 5 ] ; 不是数组的元素
数组一旦定义后,对数组元素的引用就如同普通变量一样,可以对其进行赋值和使用。
如:
a[ 1 ] = a[ 0 ] + 10 ;
scanf( " %d\n " , &a[ 2 ] ) ;
//例题
从键盘上输入5个数,跑存在数组中,并输出大于0的数。
#include <stdio.h>
int main()
{
int i , a[ 5 ];
for( i = 0; i < 5; i++) //可以利用循环控制下标的改变
scanf( " %d\n ", &a[ i ] );
printf( " \n " );
for( i=0; i < 5; i++)
if( a[ i ] > 0 );
printf( " %4d ", a[ i ] );
}
注:在利用for循环来处理数组时要注意边界问题。
如上例:
for循环如写为for( i=0; i <= 5; i++)就是有问题的,因为a[ 5 ] 不是数组a的元素。由于C语言编译系统不对数组的越界错误进行检查,上述错误就不会被指出来。但对越界数组元素,如a[ 5 ]、a[ 6 ]等错误引用可能破坏数组a后的其他数据,造成不可预料的损失,so, 可不要粗心大意啊
关于数组的引用还有以下几点:
①数组下标取值在0至 元素个数减1 的范围内
②数组元素可以像普通变量一样使用
③对数组的输入、输出或赋值只能对单个元素进行,不能整体输入或输出,
不要试图通过以下语句来完成对一个数组的输入
scanf( " %d " , a);
由于a代表的是a的起始地址,这行语句的实际作用是从键盘上输入一个数到a所对应的内存单元,即输入到数组a的第一个元素a[ 0 ]中,与语句scanf( " %d " , a[ 0 ]); 等价
同理,也不能整个一起输出
一维数组的存储结构与初始化
1、一维数组的存储结构
每个变量都与一个特定的存储单元相联系(该单元的字节数与类型有关)。
如定义数组:
static int a[ 5 ];
则数组的存储示意图如下:
由于一维数组是顺序存储在内存空间的,数组名代表了数组在内存的起始地址,而每个数组元素占用字节相同。因此,根据数组元素序号可以求得各数组元素的内存地址:
数组元素地址 = 数组元素起始地址 + 元素下标 * sizeof( 数组类型 )
2、一维数组的初始化
初始化时在编译阶段完成的,不占用运行时间。
对数组的初始化有以下情形:
①在定义数组时对所有数组元素赋初值
static int a [ 5 ] = { 8,8,2,4,123 };
static char arr [ 5 ] = { ' p ', ' r ', ' o ', ' g ', ' r ' };
注意:字符型数组初始化时,应使用字符常量。
②部分赋值
static int a [ 5 ] = {7};
其他赋0
③对全部元素赋初值时,可以不指定数组长度大小
static int a [ ] = {5,5,5,5,5};
注意:
①若一个静态数组后外部数组不进行初始化,则对数组型数组隐含初值为0;
对字符型数组,隐含空字符 ' \0 ', (ASCII码为0的字符)
②如果不对自动数组初始化,则其初始值为一些不可知的数
③当数组长度与初始个数不相等时,在定义数组时必须指定数组长度
练习:
从键盘上输入5个数存入数组,输出最大和最小以及他们的坐标。
#define N 5
#include <stdio.h>
int main()
{
int i , int k , max , min;
static int arr[ 5 ] ;
for(i=0 ; i<5 ; i++)
scanf( " %d ", &a[ i ] );
max = min = a[ 0 ]; //假设第一个是最小也是最大的
j = k = 0; //对最大最小元素和j , k进行初始化
for(i=1 ; i<5 ; i++)
{
if(max < a[ i ])
{
max = a[ i ];
j = i; //把最大值给max,记录坐标j
}
else if(min > a[ i ])
{
min = a[ i ];
k = i; //把最小值给min,记录坐标k
}
}
printf("max: a[ %d ] = %d, min: a[ %d ] = %d", j , max , k , min );
}
谢谢点赞,您的点赞是对我最大的支持