数组(一维数组)

一维数组

一维数组的定义

定义一个一维数组的一般形式为:

存储类别        类型标识符        数组名标识符[ 常量表达式 ];

数组的定义有以下说明:

存储类别说明数组的存储属性,即数组的作用域与生成期,可以是静态型(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 );

}

谢谢点赞,您的点赞是对我最大的支持   

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值