数组
一维数组
数组是一组相同类型元素的集合
定义
一般形式:
类型说明符 数组名[常量表达式];
- 数组名与变量名规则相同
- 常量表达式用来表示元素的个数,即数组长度(下标从0开始)
- 常量表达式中要给一个常量或符号常量,不能使用变量
例如:char arr3[10]; float arr4[1]; double arr5[20];
初始化
数组的初始化:在创建数组的同时给数组的内容一些合理初始值(初始化)
- 在定义数组时对全部数组元素赋予初始值
例如:int arr[5] = {1,2,3,4,5};
- 可以只给数组中的一部分赋值
例如:int arr[10] = {1,2,3};
- 可以使一个数组中全部元素值为0
例如:int arr[10] = {0};
- 赋予初值时可以不指定数组长度,系统会自动根据{ }中的数据个数来确定数组的元素个数
例如:int arr[ ] = {1,2,3,4};
引用
数组的引用操作符: [ ] ,下标引用操作符。就是数组访问的操作符
只能引用数组元素而不能一次整体调用整个数组全部元素的值
表示形式:
数组名[下标]
例如:
#include <stdio.h>
int main()
{
int arr[10] = {0};//数组的不完全初始化
//计算数组的元素个数
int sz = sizeof(arr)/sizeof(arr[0]);
//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
int i = 0;//做下标
for(i=0; i<10; i++)//这里写10,好不好?
{
arr[i] = i;
}
//输出数组的内容
for(i=0; i<10; ++i)
{
printf("%d ", arr[i]);
}
return 0;
}
结果:
0 1 2 3 4 5 6 7 8 9
- 数组是使用下标来访问,下标从0开始
- 数组的大小可以通过计算得到
计算数组的大小:
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);
在内存中的存储
数组在内存中是连续存放的
随着数组下标的增长,元素的地址,也在有规律的递增
最低的地址对应第一个元素,最高的地址对应最后一个元素
二维数组
二维数组常称为矩阵
定义
一般形式:
类型 数组名[常量表达式1][常量表达式2];
常量表达式1:行
常量表达式2:列
例如:
int x[3][4];
初始化
通过在括号内为每行指定值来进行初始化
- 分行给二维数组赋初值
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
- 所有数据都写在一个花括号
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
与第一种相同
- 对部分元素赋值
int arr[3][4] = {{1},{5},{9}};
- 对全部元素都赋初值,则定义数组时对行可以省略,但列不可以
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
等价于
int arr[ ][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[ ][4] = {{2,3},{4,5}};
引用
一般形式:
数组名[下标][下标]
例如:
#include <stdio.h>
int main()
{
int arr[3][4] = { 0 };
int i = 0;
for (i = 0; i<3; i++)
{
int j = 0;
for (j = 0; j<4; j++)
{
arr[i][j] = i * 4 + j;
}
}
for (i = 0; i<3; i++)
{
int j = 0;
for (j = 0; j<4; j++)
{
printf("%d ", arr[i][j]);
}
}
return 0;
}
结果:
0 1 2 3 4 5 6 7 8 9 10 11
在内存中的存储
二维数组在内存中也是连续存储的
数组越界
数组的下标是有范围限制的。
- 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1
- 数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问
字符数组
定义
用来存放字符数据的数组。在字符数组中的一个元素内存放一个字符
字符型数据是以整数形式(ASCII代码)存放的,所以也可以用整型数组来存放字符数据
初始化
把各个字符一次赋给数组的各个元素
例如:char c[10] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’,‘h’,‘i’,‘j’};
- 不进行初始化,则数组中各元素的值是不可预料的
- 若初值个数(字符个数)大于数组长度,则出现语法错误
- 初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符
- 若初值个数与预定的数组长度相同,在定义时可以省略数组长度,由初值个数确定数组长度
- 也可以定义和初始化一个二维字符数组
例如:
#include<stdio.h>//头文件
int main()
{
char c[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
int i;
for (i = 0; i < 10; i++)
printf("%c", c[i]);
printf("\n");
return 0;
}
结果:
abcdefghij
字符串
将字符串作为字符数组来处理
字符串中的字符是逐个存放到数组元素中的
字符串的实际长度与数组长度相等
字符串结束标志:以‘\0’作为结束标志,在遇见字符‘\0’时,表示字符串结束,在他前面的字符组成一个字符串
在用字符数组存储字符串常量时会自动加一个‘\0’作为结束符。
例如:
“i am a student”共有14个字符。字符串是存放在一维数组中的,在数组中它占15个字节,最后一个字节‘\0’是由系统自动加上的。
‘\0’代表ASCII码为0的字符
对字符数组初始化的方法有两种:
c的长度为15
- char c[ ] = { “i am a student”};
- char c[ ] = “i am a student” ;
等价于
char c[ ] = { ‘i’, ’ ', ‘a’, ‘m’, ’ ‘, a’, ’ ', ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’, ‘\0’ };长度为15
不同于
char c[ ] = { ‘i’, ’ ', ‘a’, ‘m’, ’ ‘, a’, ’ ', ‘s’, ‘t’, ‘u’, ‘d’, ‘e’, ‘n’, ‘t’ };长度为14
遇见‘\0’就停止输出
字符数组的输入输出
- 逐个字符输入输出:%c输入或输出一个字符
- 整个字符串一次输入输出:%s输入或输出一个字符串
- 输出的字符中不包括’\0’
- %s输出字符串时,printf函数中的输出项是字符数组名(c),而不是数组元素名(c[0])
- 若数组长度大于字符串的实际长度,也只输出到遇’\0’结束
- 若一个字符数组中包括一个以上’\0’,则遇的第一个’\0’时输出就结束
- 可以用scanf函数输入一个字符串:scanf(“%s”, c);
- 利用scanf函数输入多个字符串:scanf(“%s%s%s”, a, b, c );
- scanf函数中的输入项如果是字符数组名,不要再加&
- 数组名代表数组第一个元素的地址
puts函数
输出字符串的函数
一般形式:
puts(字符数组)
作用:将一个字符串(以’\0’结束的字符序列)输出到终端
在用puts输出时将字符串结束标志’\0’转换成’\n’,即完成字符串后换行
gets函数
输入字符串的函数
一般形式:
gets(字符数组)
作用:从终端输入一个字符串到字符数组,并得到一个函数值。该函数值是字符数组的起始地址。
一般利用gets函数的目的是向字符数组输入一个字符串
用puts和gets函数只能输出或输入一个字符串
strcat函数
字符串连接函数
一般形式:
strcat(字符数组1,字符数组2)
作用:把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址
- 字符数组1必须足够大,以便容纳连接后的新字符串。
- 连接前两个字符串的后面都有‘\0’,连接时将字符串1后面的‘\0’取消,只在新串最后保留‘\0’
例如:
#include<stdio.h>
int main()
{
char str1[30] = { "People's Republic of " };
char str2[] = { "China" };
printf("%s", strcat(str1, str2));
return 0;
}
结果:
People’s Republic of China
str3为两个合成后的最终值
strcpy和strncpy
字符串复制函数
一般形式:
strcpy(字符数组1,字符串2)
作用:将字符串2复制到字符数组1中去
- 例如:
char str1[10],str2[ ] = “China”;
strcpy(str1,str2);
- 字符数组1的长度大于等于字符串2的长度
- “字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名也可以是一个字符串常量
- 复制前要先对字符数组1进行初始化或赋值
- 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。
- 字符数组名是一个地址常量,不能改变值,正如数值型数组名不能被赋值。
- strcpy函数只能将一个字符赋给一个字符型变量或字符数组元素
strncpy函数一般式:
strncpy(str1,str2,2)
作用:将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符
但复制的字符个数n不应多于str1中原有的字符(不包括‘\0’)
strcmp函数
字符串比较函数
一般形式:
strcmp(字符串1,字符串2)
作用:比较字符串1和字符串2
字符串比较规则:
将两个字符串从左向右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇见‘\0’为止
- 若全部字符相同,则认为两个字符串相等
- 若出现不相同的字符,则以第一对不相同的字符的比较结果为准
例如:“A”<“B”,“a”>“A”,“computer”>“compare”
- 比较两个字符串都由英文字母组成:在英文字典中位置在后面的为“大”
例如:“computer”>“compare”
比较的结果由函数值带回
- 如果字符串1与字符串2相同,则函数值为0
- 如果字符串1>字符串2,则函数值为一个正整数
- 如果字符串1<字符串2,则函数值为一个负整数
对两个字符串比较,不能用 if(str1>str2),只能 if(strcmp(str1>str2)>0)
strlen函数
测字符串长度的函数
一般形式:
strlen(字符数组)
作用:测试字符串长度的函数。函数的值为字符串中的实际长度(不包括‘\0’在内)
strlwr函数
转换为小写的函数
一般形式:
strlwr(字符串)
作用:将字符串中大写字母换成小写字母
strupr函数
转换为大写的函数
一般形式:
strupr(字符串)
作用:将字符串中小写字母换成大写字母