c 数组

一维数组

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

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

(1)数组名的命名规则和变量名相同,遵循标识符命名规则。
  (2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,student[10],表示a数组有10个元素。注意,下标是从0开始的,这10个元素分别是student[0]...student[9]。一定要注意这里面不会有student[10].

(3)常量表达式中可以包括常量和符号变量,如“int a[4*2]”是合法的。但是不能包括变量,如下面的就是不合法的:

int n;
scanf("%d",&n);
int b[n];

经过上面的定义,在内存中划出一片存储空间(空间大小:4*10=40字节),存放一个含有10个整形元素的数组。

image.png
  • 一维数组的初始化

(1)全部赋值:int a[10]={0,1,2,3,4,5,6,7,8,9}
a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9;
  (2)部分元素赋值:int a[10]={0,1,2,3};部分赋值中,除被赋值元素外,其余元素被初始化为0。

  • 一维数组应用(冒泡排序)
#include <stdio.h>
int main ()
{
    int i,j,stscore[10];
    for(i=0;i<10;i++)
    {
        stscore[i]=rand();
        printf("stscore[%d]=%d\n",i,stscore[i]);
    }
    
    for(i=0;i<=9;i++){
        
        for(j=i+1;j<=9;j++){
            
            int temp;                                                     
            if(stscore[i]<stscore[j]){
                
                temp=stscore[i];
                stscore[i]=stscore[j];
                stscore[j]=temp;
                
            }
        }
        
    }
    for(i=0;i<10;i++)
    {
        printf("stscore[%d]=%d\n",i,stscore[i]);
    }
    
    return 0;

二维数组

二维数组的定义方法和一维数组类似,其一般形式为:

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

例如:

float a[3][4];

c语言中,二维数组在内存中存放的顺序是按行存放的,即在内存中先顺序存放第一行元素,接着再来存放第二行元素。
假设数组存放是从2000开始的,一个元素占用4个字节,下图就是a[3][4]在内存中存放的具体形式。

Alt text
  • ** 二维数组的初始化**

(1)分行给二维数组赋初值。例如:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

这种赋值方法比较直观,把第一个花括号的值给第0行元素,第2个花括号的值给第一行元素....

(2)可以将所有的数据放在一个花括号内,例如:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

效果和(1)相同。但是很显然第一种方式较好,一行对一行,界限很清楚。用第二种方法如果数据多,则会写成一大片,容易遗漏。

(3)可以对部分元素赋初值。例如:

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

它的作用是只给各行第0列的元素赋初值,其他元素默认为0.赋初值后的结果为:

1 0 0 0
3 0 0 0
5 0 0 0

字符数组

前面我们已经讲解过,字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。由于ASCII代码属于整数形式,因此,把字符型归纳为整数类型中的一种。
由于字符数据的应用十分广泛,尤其是作为字符串形式的使用,有其自己的特点,我们单独成节来讲述该内容。

注意:c语言中没有字符串类型,字符串都是存储在字符型数组中的。

  • 字符数组的定义

定义字符数组的方法与定义数值型数组的方法类似:例如:

char c[10];

以上就定义了c为字符数组,包含10个元素。

  • 字符数组的初始化

把各个字符以此赋给数组中格元素。例如:

char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};```

把这10个字符以此赋给c[0]~c[9]这10个元素。

**注意:**上面例子中花括号提供的初值个数(即字符个数)等于数组长度,倘若花括号中的提供初值个数大于数组长度,则会出现语法错误。**倘若初值个数小于数组长度**,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(即''\0').例如:

char c[10]={'I',' ','l','o','v','e',' ','c'};


该数组在内存的存储状态如下:

![Alt text](http://upload-images.jianshu.io/upload_images/815734-67855bda0a28468e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在定义数组时可以省略数组长度,系统会自动根据处置个数确定数组长度。例如:

char c[]={'I',' ','a','m',' ','h','a','p','p','y'};


数组c的长度自动定为10.这种方式不用人工去数字符的个数,尤其在赋初值字符个数不较多的情况下,比较方便。

- **字符串和字符串结束标志**


在c语言中,是将字符串作为字符数组来处理的。在平时的应用中,人们往往关心的是字符串的有效长度而不是字符数组的长度。例如,定义一个字符数组长度50,而实际有效字符只有30个。为了测定字符串的实际长度,c语言规定了一个“字符串结束标志('\0')”,以字符'\0'作为结束标志。如果字符数组中存在若干字符,前面9个字符都不是空字符('\0'),而第10个字符是'\0',则认为数组中有一个字符串,其有效字符为9个。
c系统在用字符数组存储字符串常量时会自动加一个'\0'作为结束符。
例如:

printf("Shiyanlou");

在执行次语句时系统怎么知道该输出到哪里为止呢?实际上,在向内存中存储时,系统自动在最后一个字符'u'后面加一个'\0'作为字符串结束标志。在执行printf函数时,每输出一个字符检查一次,看下一个字符是否为'\0',遇到'\0'就停止输出。

![Alt text](http://upload-images.jianshu.io/upload_images/815734-51d4fab441d69b98.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

有了上述理解,在对字符数组初始化的方法上面我们做出一些补充。例如:

char[]={I love shiyanlou};


我们也可以直接省去花括号:

char[]="I love shiyanlou";


这里不像之前单个字符作为字符数组的初值,而是用字符串作为初值(**字符串做初值是用双撇号而不是单撇号**)。这种方法更直观、更方便。

**注意:**此时数组的长度是17,而不是16,因为**字符串常量的最后系统自动加了一个'\0&#39**;。上面的初始化与下面的初始化等价的。

char c[]={char c[]={'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u','\0'};};


和下面的这个不等价:

char c[]={'I',' ','l','o','v','e',' ','s','h','i','y','a','n','l','o','u'};









##参考文献
[1][实验楼C 语言入门教程](https://www.shiyanlou.com/courses/running)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 9,559评论 2 13
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,814评论 3 44
  • 儿子生病在家,又赶上元旦假期,不用上学不用做作业不用上兴趣班,时间顿时充裕起来,做什么好呢? 觉得头晕...
    一米69阅读 2,801评论 0 3
  • 一 林小小在外人的眼里是一个很悲剧的人,三岁母亲便跟别人私奔跑了,五岁被后妈虐的街知巷闻,好不容易熬到了后妈生了小...
    茶了喵阅读 1,306评论 4 0
  • 鱼头 40岁 潜水教练 ▼ 这样的女人得分两类。 第一类:30-35岁。这一类没结婚的可能有这些原因:1、长得太差...
    她生活阅读 4,809评论 0 2