数组
数组本身是一种构造数据类型,主要将相同类型的变量集合起来,用一个名称来代表。
数组也是一种自定义类型,使用之前要先定义,以便编译程序能分配内存空间供程序使用。
一维数组的定义
一维数组的定义形式:
数据类型 数组名[整形常量表达式];
(1)数据类型:规定数组的数据类型。
(2)数组名:表示数组的名称,命名规则和变量名相同,为任一合法的标识符,不要与其他变量名或关键字重名。
(3)整形常量表达式:必须用方括号括起来,规定了数组中包含元素的个数,其中包括常数和符号常量,不能包含变量。
说明:数组名后面的方括号内容不能为空,必须为整形常量表达式。(程序在编译时 要以此为数组分配存储空间的大小)
一位数组的初始化
一维数组的初始化形式:
数据类型 数组名[整型常量表达式]={常量表达式,常量表达式.......}
初始化的方式:
(1)在定义时对全部数组元素赋初值。
e.g int x[5]={1,2,3,4,5}
(2)在定义时只给部分元素赋初值。
e.g int x[5]={1,2} 后面三个元素自动默认为0
(3)只能给元素逐个赋值,不能给数组整体赋值。
e.g “int x[5]={1,1,1,1,1};” 而不能写成 “int x[5]={1};”
一维数组的引用
一维数组的引用方式:
数组名[下标表达式]
在这里下表表达式可以是任何非负表达式,包括整型变量,整型常量,含有运算符的整型表达式,以及返回值为整数的函数调用。
引用数组元素时应注意以下几点:
(1)由于数组元素与同一类型的简单变量具有相同的地位和作用,因此对变量的任何操作都适用于数组元素。
(2)在引用数组元素时下表可以是整型常数或表达式,表达式内允许变量存在。
(3)引用数组元素时下表最大值不能越界。
(4)C语言中一般与逐个地使用下表变量来引用数组元素。
(5)
(6)数组是用下标访问的,数组的起始位置为0。
(7)数组的长度可以计算。
e.g int arr[10];
int sz =sizeof(arr)/sizeof(arr[0]) ;
指针与数组
指针运算
指针只能用地址表达式表示,不能像普通整数那样指针进行任意运算。
指针的算术运算:
(1)指针与整数的加减运算:指针加减一个整数n,这种运算用于将指针当前所指向的位置向前或向后移动n个数据的位置。
(2)两个指针相减运算:这种运算只能在同一指针类型中进行,主要用于对数组的操作,结果是整数而不是指针。
(3)++ --运算:指针变量自增自减运算也是指针运算。指针加1运算后,指针指向下一个数据的起始位置。指针减1运算后,指针指向上一个数据的起始位置。
指针的关系运算:
指针的关系运算表示他们所指向的地址之间的关系。指针之间的四种关系运算:
<或>:用来比较两只指针所指向的地址的大小关系
==或!=:用来判断两指针是否指向同一地址,即是否指向同一数据。
指针不能与一般数值进行关系运算,但指针可以和零之间进行不等于或等于运算。
指向一位数组的指针
一维数组的地址
一维数组元素a[i]的地址可以写为&a[i]或a+i,&a[i]使用下标形式表示的地址,a+i是用指针形式表示的地址,但是两个的结果相同。
一维数组指针的定义:
(1)用数组名作为首地址。 如:p=a;将数组a的起始地址赋给指针p,而不是将数组a的所有元素赋值给指针p。
(2)用数组第0个元素的地址作为首地址。 如:p=&a[0];(*p的数据类型要与数组的数据类型一致)
利用指针引用一维数组元素:
方式有两种:
(1)下标法:a[i], p[i]
(2)指针法:*(p+i), *(a+i)
说明:
(1)使用下标法比较直观,使用指针法执行效率更高。
(2)使用指针引用数组下标不能越界。
通过指针访问数组元素时必须首先让该数组指针指向当前数组。
表达式 | 含义 |
&a[i],a+i,p+i | 引用数组元素a[i]的地址 |
P[i],a[i],*(p+i),*(a+i) | 引用数组元素a[i] |
*p++,*(p++) | 先取p指向的存储单元内容*p,再使p指向下一个存储单元 |
p++,p=p+1 | 表示指向下一数组元素 即a[1] |
*++p,*(++p) | 先使指针指向下一个存储单元,然后取改变后指针指向的存储单元内容*p |
(*p)++ | 取指针p所指的存储单元内容作为表达式的结果值,然后使p所指对象的值加1,即*p=*p+1;指针的内容不变 |
二维数组的定义
二维数组定义的形式:
数据结构 数组名[整型常量表达式1][整形常量表达式2];
说明:
(1)与一位数组相同,下标只能是整数,并且从0开始
(2)计算机中二维数组是按行优先存储的,
二维数组的引用
C语言中规定不能引用整个数组,只能逐个引用数组元素。
二维数组的引用形式:
数组名 [下标表达式1][下标表达式2];
二维数组元素的初始化
二维数组元素初始化的四种形式:
(1)按行对二维数组赋初值,将每一行元素的初值用一对花括号括起来。
例如:int x[3][3]={{1,2,3},{2,3,4},{3,4,5}}
(2) 根据该数组的元素个数,吧初始化数据全部扩在一个花括号内,由二维数组按行存储的规则一次赋值给数组对应的元素。
例如:int x[3][3]={1,2,3,2,3,4,3,4,5};
(3) 对部分数组元素赋初值
例如:int x[3][3]={{1,2,3},{2,3,4},{3,4,5}};
(4) 在二维数组元素初始化是可以省略第一维的长度,但必须制定第二维的长度。第一维的长度有系统根据初始值表中的初值个数来确定。
例如:int x[][3]={1,2,3,2,3,4,3,4,5};
指向二维数组的指针
二维数组a的各种表示形式及其含义
表示形式 | 含义 |
a | 数组a的起始地址 |
a+i,&a[i] | 第i行的起始地址 |
*(a+i),a[i] | 第i行第0列元素的起始地址 |
*(a+i)+j,a[i]+j,&a[i][j] | 第i行第j列元素的起始地址 |
*(*(a+i)+j),*(a[i]+j),a[i][j] | 第i行第j列元的值 |
指向二维数组元素的指针变量
(1)定义与二维数组相同类型的指针变量。
(2)在指针变量与要处理的数组元素之间建立关联。
(3)使用指针的运算就可以访问到任何一个数组元素,完成操作处理。
字符数组与字符串
字符数组的定义与操作
字符数组的定义
一维字符串数组的定义形式:
char 数组名[整型常量表达式];
二维字符串数组的定义形式:
char 数组名[整型常量表达式1][整型常量表达式2];
字符串数组的初始化
字符串数组允许在定义时做初始化赋值,通常方式是把字符逐个地赋给数组中的各元素。
字符数组的引用
字符数组中的每个元素都相当于一个字符变量,因此对一个数组元素的引用就是对一个字符变量的引用。
字符串
字符串常量:用双引号括起来的一串字符就是字符串常量,末尾有系统自动加的一个字符串结束标志‘\0’.
字符数组与字符串的区别在于字符串结尾有‘\0’。
字符串的输入与输出
由于字符串是存储在字符数组中的,所以字符串的输入和输出实际就是字符数组的输入与输出。字符数组的输入与输出有两种方式:
(1)利用‘%c’格式符,逐个的输入或输出一个字符。
(2)利用‘%s’格式符,每次输入或输出一个字符串。
字符串操作处理函数
(1)字符串拷贝函数strcpy()一般形式为strcpy(str1,str2)
(2)字符串连接函数strcat()一般形式为strcat(str1,str2)
(3)字符串比较函数strcmp()一般形式为strcmp(str1,str2)比较字符的ASCII码值的大小
(4)字符串求长度函数strlen()一般形式为strlen(str)输出字符串实际长度,不包括‘\0’
(5)字符串大小写字母转换函数strlwr()和strupr() 一般形式为strlwr(str)和strupr(str)
指针与字符串
指向字符串的首地址的指针变量乘坐字符串指针,实际上是字符类型的指针。
定义形式为:char *变量名
利用一个字符串指针访问字符串有两种方式:
(1)讲一个字符串的起始地址赋值给指针变量。
例如: char *p;
char a[]=”abc”;
p=a;
(2) 将一个字符串常量赋值给指针变量
例如:char *p;
P=”abc”;
指针数组
指针数组的定义方式:
数据类型 *数组名[整形常量表达式];