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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

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