C语言基础知识整理8数组

本文详细介绍了C语言中的数组,包括一维数组、二维数组(矩阵)和字符数组的定义、引用、初始化以及存储方式。强调了数组在内存中是线性存放的,一维数组可以通过下标和指针引用元素,二维数组可以按行优先顺序存储。同时,讨论了字符数组和字符串的处理,指出字符串以''作为结束标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

一批具有同名的同属性的数据就组成一个数组(array),数组右下角的数字称为下标。

  1. 数组是一组有序数据的集合,下标代表数据在数组中的序号;
  2. 用一个数组名(如s)和下标来唯一地确定数组中地元素;
  3. 数组中地每一个元素都属于同一个数据类型。

C语言规定用方括号中的数字来表示下标。

数组名作实参,传递的是数组首地址,实参形参共用一段地址单元

 

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

定义

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

//数组名命名规则遵循标识符命名规则。

//定义数组时,需要指定数组元素个数,方括号中常量表达式用来表示元素个数(数组长度)

//常量表达式可包括常量和符号变量,不能包含变量

//C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。

//主函数中数组大小是确定的,不允许动态定义,可在被调用函数中动态定义。如下:

可变长数组定义

void func(int n){int a[2*n];/*合法,n的值从实参传来*/···}

//允许在调用时,n有不同值。但是在执行函数时,n的值是不变的,数组长度是固定的。

//如果指定数组为静态存储方式,则不能用“可变长数组”

 

引用

         数组名[下标];//只能引用数组元素而不能一次整体调用整个数组全部元素的值

引用数组元素       

1.下标法:数组名[下标] //下标可以是整型常量或整型表达式。

//数组下标从0开始     c语言中数组名(不包括形参数组名)代表数组首元素。

2.指针法:通过指针找到该元素,可以使目标程序的代码质量更高。占内存少,运行快。

 

数组初始化://数组元素中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。

                          //花括号内的数据就称为“初始化列表”

 

在定义数组时若对全部数组元素赋初值,可不写数组长度。

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

 

也可只给数组中部分元素赋值,此时未赋值元素整型为0,字符型为‘\0’,指针型为NULL

 

二维数组(矩阵) 类型符 数组名[常量表达式][常量表达式];

定义

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

//二维数组常称为“矩阵”(数组的数组),常写成行和列的排列形式。

//用矩阵形式表示二维数组,是逻辑上的概念,能形象表示行列关系;

//在内存中,各元素是连续存放的,不是二维的,是线性的。

//C对二维数组如此定义,因此其可看作特殊的一维数组:其元素为一个一维数组

如:int a[3][4],可以看作一维数组,有三个元素a[0],a[1],a[2]

每个元素又是一个包含4个元素得到一维数组:

a[0]---a[0][0] a[0][1] a[0][2] a[0][3]

a[1]---a[1][0] a[1][1] a[1][2] a[1][3]       

a[2]---a[2][0] a[2][1] a[2][2] a[2][3]

可以把a[0],a[1],a[2]看作是3个一维数组的名字。

上面的二维数组可以理解为定义了3个一位数组,即相当于int a[0][4],a[1][4],a[2][4];

此处把a[0],a[1],a[2]看作一维数组名。

此处理方法可使得数组初始化和用指针表示时很方便。

C中数组元素按行存放。

//C允许使用多维数组

//多维数组在内存中排序顺序为,第一维下标变化最慢,最右边下标变化最快。

 

引用

         数组名[下标][下标];//下标不可超过范围,行、列序号均从0起算

 

初始化

分行给二维数组赋初值 //直观,第n个花括号对应第n行,即按行赋初值

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

 

可以将所有数据写在一个花括号内,将数组元素在内存中的排列顺序对各元素赋初值。

         int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};//建议使用上一种方法。

 

也可以部分赋值:int a[3][4]={{1},{5},{9}}; 或int a[3][4]={{1},{0,6},{0,0,11}};

也可对某几行元素赋初值:int a[3][4]={{1},{5,6}}; 或 int a[3][4]={{1},{},{9}};

 

若对全部元素赋初值,则定义时对第一维的长度可以不指定,但是第二维长度不能省!

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

 

也可以只对部分赋初值省略第一维长度,但应分行赋初值。

int a[][4]={{0,0,3},{},{0,10}};

 

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

字符数组 char 数组名[常量表达式];

//字符型数据是以字符的ASCII代码存储在存储单元中的,一般占一个字节。

//由于ASCII代码也属于整数形式,因此在C99标准中,把字符类型归纳为整型类型中的一种。

//C语言中没有字符串类型,字符串是存放在字符型数组中的

定义

         char c[10];//用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。

//由于字符型数据是以整数形式存放的,因此也可以用整型数组存放,但浪费空间。

                  int c[10]; c[0]=’a’;

初始化

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

//初始化列表,把各个字符依次赋给数组各元素。

//若不进行初始化,则数组元素不可预计。若提供初值个数大于数组长度,出现语法错误。

//若提供的初值个数与预定数组长度相同,在定义时可以省略数组长度,系统会自动确定数组长度。

         char c[]={‘I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’};//系统自动定义长度为10

//在赋初值的字符个数较多时较方便。

 

//也可以用字符串常量来使字符数组初始化:

char c[]={“I am happy”}; 

//花括号可以省略  

char c[]=”I am happy”;//此时数组c长度为11不是10,系统自动加了’\0’。

 

//也可以定义和初始化一个二维字符数组。

如:char c[5][5]={{‘*’},{‘*’,’*’},{‘ ’},{‘ ’,’*’}};

 

字符串和字符串结束标记:C将字符串当作字符数组处理。’\0’代表ASCII码为0的字符(空操作符)。

//在遇到字符’\0’时,表示字符串结束,将其前面的字符组成一个字符串。

//字符串结束标记’\0’。C系统在用字符数组存储字符串常量时会自动加一个’\0’作为结束符。

如”C program”共有9个字符,在数组中占10个字节,最后一个字节’\0’由系统自动加上。

//在程序中往往依靠检测’\0’的位置来判定字符串是否结束,而非根据数组长度来决定字符串长度。

//在printf(“****\n”);语句中自动在其最后加’\0’,每输出一个字符检查一次,看是否遇到’\0’,遇到就停止。

 

//字符数组并不要求他的最后一个字符为’\0’,甚至可以不包含’\0’。是否加,完全根据需要决定。为了使使用方法一致,便于测定字符串的实际长度,以及在程序中做相应处理,在字符数组中也常常人为增加'\0'。这样做,便于引用字符数组中的字符串。

 

字符数组的输入输出

字符数组的输入输出可以有两种方法:

  1. 逐个字符输入输出。用格式符“%c”输入或输出一个字符。
  2. 将整个字符串一次输入或输出。用“%s”格式符,意为对字符串string的输入输出。

//输出字符中不包括结束符’\0’

//用%s输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。执行过程是按字符数组名c找到起始地址,然后组个输出,直到遇’\0’为止。

//若数组长度大于字符串实际长度,也只输出到遇到’\0’结束。

//如果一个字符数组中包含一个以上’\0’,则遇到第一个’\0’时输出就结束。

//可以用scanf输入一个字符串。输入字符串长度应短于已定义字符数组长度。

//若利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。

//scanf函数输入项若是字符数组名,不要加地址符&,因为C中数组名代表该数组起始地址

//可以用printf(“%o”,c);输出数组c的八进制起始地址

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值