C语言学习5

文章目录
  1. 1. 数组
    1. 1.1. 一维数组的定义和引用
      1. 1.1.1. 一维数组的定义
      2. 1.1.2. 一维数组元素的引用
      3. 1.1.3. 一维数组的初始化
    2. 1.2. 二维数组的定义和引用
      1. 1.2.1. 二维数组的定义
      2. 1.2.2. 二维数组元素的引用
      3. 1.2.3. 二维数组的初始化
      4. 1.2.4. 通过赋初值定义二维数组的大小
    3. 1.3. 字符数组
      1. 1.3.1. 字符数组的定义
      2. 1.3.2. 字符数组的初始化及引用
      3. 1.3.3. 字符串和字符串结束标志
      4. 1.3.4. 字符数组的输入输出
      5. 1.3.5. 字符串处理函数
      6. 1.3.6. C语言数组是静态的
      7. 1.3.7. 数组越界与溢出

数组

本文将描述数组的定义与应用、字符串处理等知识。

一维数组的定义和引用

一维数组的定义

一维数组是指数组中的每一个元素只带有一个下标的数组。定义方式:类型说明符 数组名[常量表达式]

一维数组元素的引用

数组元素的引用形式为:数组名[下标表达式]
说明:
●一个数组元素实质上是一个变量名,代表内存中的一个存储单元,一个数组占据的是一连串连续的存储单元。
●引用数组元素时,数组的下标可以是整型常量,也可以是整形表达式。
●数组必须先定义后使用
●只能逐个引用数组元素而不能一次引用整个数组。

一维数组的初始化

当数组定义后,系统会为该数组在内存中开辟一串连续的存储单元,但这些存储单元中并没有确定的值。可以在定义数组时为包含的数组元素赋初值。如:int a[6]={0,1,2,3,4,5}
说明:
●所赋初值放在一对花括号中,数值类型必须与所说明类型一致。
●所赋初值之间用逗号隔开,系统将按这些数组的排列顺序,从a[0]元素开始依次给数组a中的元素赋初值。
●不能跳过前面的元素给后面的元素赋初值,但是允许为前面元素赋值为0。
●当所赋初值个数少于所定义数组的元素个数时,将自动给后面的其他元素补初值0。
●可以通过赋初值来定义一维数组的大小,定义数组时的一对方括号中可以不指定数组的大小。

二维数组的定义和引用

二维数组的定义

1.在C语言中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行元素,再存放第二行的元素。二维数组元素的存储总是占用一块连续的内存单元。
2.一般形式: 类型说明符 数组名[常量表达式][常量表达式]

二维数组元素的引用

表示形式: 数组名[下标表达式1][下标表达式2]
●数组的下标可以是整型表达式
●数组元素可以出现在表达式中,可以被赋值

二维数组的初始化

●可以在定义二维数组的同时给二维数组的元素赋初值
●全部初值放在一对花括号中,每一行的初值又分别括在一对花括号中,之间用逗号隔开。
●当某一对花括号内的初值个数少于该行中元素的个数时,系统将自动地给后面的元素赋初值0
●不能跳过每行前面的元素而给后面的元素赋值。
●对于二维数组,只可以省略第一个方括号中的常量表达式,但不能省略第二个方括号中的常量表达式。

通过赋初值定义二维数组的大小

对于一维数组,可以在数组定义语句中省略方括号中的常量表达式,通过所赋初值的个数来确定数组的大小;
对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式。

字符数组

字符数组的定义

字符数组就是数组中的每一个元素都是字符。定义方法同普通数组的定义相同,即逐个对数组元素赋值。

字符数组的初始化及引用

1.初始化:对字符数组初始化,可逐个元素地赋值,即把字符逐个赋给数组元素。
●如果花括号中提供的初值个数(即字符个数)大于数组长度,则编译时会按语法错误处理。
●如果初值个数小于数组长度,则将这些字符赋值给数组中前面那些元素,其余元素定为空字符\0;
2.引用形式:采用下标引用,即
数组名[下标]

字符串和字符串结束标志

C语言中,将字符串作为字符数组来处理。为测定字符串的实际长度,C语言规定了一个字符串结束标志,以字符”\0”代表。就是说,在遇到字符”\0”时,表示字符串结束,由它前面的字符组成字符串。

字符数组的输入输出

字符数组的输入输出有两种方法:
●用”%c”格式符将字符逐个输入或输出。
●用”%s”格式符将整个字符串一次输入或输出。

在C语言中,有两个函数可以在控制台(显示器)上输出字符串
●puts() 输出字符串并自动换行,该函数只能输出字符串。
●printf() 通过格式控制符%s输出字符串,不能自动换行。除了字符串,printf()还可输出其他类型数据。

在C语言中,有两个函数可以从键盘上输入字符串,它们是
●scanf() 通过格式控制符%s输入字符串。除了字符串,scanf()还能输入其他类型的数据。[遇到空格就结束输入,无法含有空格]
●gets() 直接输入字符串,并且只能输入字符串。[认为空格也是字符串的一部分,以回车作为字符串结束]

字符串处理函数

C语言没有提供对字符串进行整体操作的运算符,但在C语言的函数库中提供了一些用来处理字符串的函数。在调用这些函数前,必须在程序前面命令行包含标准头文件”string.h”。
●puts() 调用形式为puts(字符数组),将一个字符串(以”\0”结束)输出到终端设备。
●gets() 调用形式为gets(字符数组),从终端输入一个字符串到字符数组中,并得到一个函数值。
●strcpy() 调用形式strcpy(字符数组1,字符数组2),把字符数组2所指字符串的内容复制到字符数组1所指存储空间中。函数返回字符数组1的值,即目的串的首地址。
●strcat() 调用形式为strcat(字符数组1,字符数组2),该函数将字符数组2所指字符串的内容连接到字符数组1所指的字符串后面,并自动覆盖字符数值1串末尾的”\0”。该函数返回字符数组1的地址值。
●strlen() 调用形式为strlen(字符数组),此函数计算出以字符数组为起始地址的字符串的长度,并作为函数值返回。
●strcmp() 调用形式为strcmp(字符数组1,字符数组2),该函数用来比较字符数组1和字符数组2所指字符串的大小。若字符数组1>字符数组2,函数值大于0(正数);若字符数组1=字符数组2,函数值等于0;若字符数组1<字符数组2,函数值小于0(负数)。

C语言数组是静态的

在C语言中,数组一旦被定义,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组
▲动态数组:指数组在定义后可以改变容量,允许任意位置插入或删除元素的数组。
一般 C、C++等编译型语言不支持动态数组;而PHP、JavaScript等解释型语言支持动态数组。

数组越界与溢出

数组越界: 当数组下标小于0或大于等于数组长度时引用 就会发生越界(out of bounds),即访问数组以外的内存。
下标小于0即下限越界(Off Normal Lower)
下标大于等于数组长度即为上限越界(Off Normal Upper)
数组溢出:即赋予数组元素的个数超过数组长度。

注意:在用字符串给字符数组赋值时,要保证数值长度大于字符串长度,以容纳结束符”\0”。

C语言变长数组(VLA, Variable Langth Array):使用变量指明数组长度。
●在C89标准中,必须使用常量表达式指明数组长度。
●在C99标准中,可以使用变量指明数组长度。
变长数组仍是静态数组,其长度一旦定义就无法改变。


版权声明

Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Scholar’s Blog博客,版权所有,侵权必究。

本文永久链接:https://scholargeek.github.io/2018/02/10/C%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A05/

更新日期:


本站总访问量