C语言学习笔记(五):数组的使用
数组的定义
数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
用数组名和下标即可唯一地确定数组中的元素。
数组中的每一个元素都属于同一个数据类型。
一维数组
定义与引用
int a[10] = {0,1,2,3,4,5,6,7,8,9}; //定义数组长度为10,数组类型为整型,数组名字为a
printf("%d", a[9]); //输出数组下标为9的元素, 即输出8
初始化
int a[10]={0,1,2,3,4,5,6,7,8,9}; //在定义数组时对全部数组元素赋予初值
int a[10]={0,1,2,3,4}; //定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0。
int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 给数组中全部元素赋初值为0
int a[] = { 0,1,2,3,4,5,6,7,8,9}; //自动设置数组长度为10,
二维数组
定义与引用
float a[3][4], b[5][10]; //定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组
a[3][4] = 8; //不存在a[3][4]元素,数组a可用的“行下标”的范围为0~2,“列下标”的范围为0~3
/*在引用数组元素时,下标值应在已定义的数组大小的范围内。*/
include <stdio.h>
int main()
{
int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
int(*p)[3]; //
printf("%d\n", (a[0])); //a[0]表示行指针,输出第一行的地址,即第一行首元素的地址
printf("%d\n", a[1][0]); //输出4
printf("%d\n", a[0]+1); //a[0] + 1表示列指针,输出第一行第二列的地址,即2的地址
printf("%d\n", *(a[0] + 1)); // 输出2
printf("%d\n", *(a[0])); //输出第一行第一个元素,即1
printf("%d\n",*(a+1)); //输出第二行的首地址
printf("%d\n", a+1); //输出第二行的首地址
printf("%d\n", *(*(a + 1))); //输出第二行的首个元素4
printf("%d\n", *a); //输出第一行的首地址
printf("%d\n", *(*a+1)); //输出第一行第二列元素,即2
}
初始化
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}}; //給每行第一列元素赋值,其他元素值为0
int a[3][4]={{1},{0,6},{0,0,11}};
int a[3][4]={{1},{5,6}}; //给第1,2行部分元素赋值,其余元素值为0
int a[3][4]={{1},{},{9}}; //给第1,3行部分元素赋值,其余元素值为0
/*如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省*/
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[][4]={{0,0,3},{},{0,10}}; //在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值
存储方式
C语言中,二维数组中元素排列的顺序是按行存放的。
多维数组
定义与引用
float a[2, 3, 4]; //定义三维数组a,此处表示2页,3行,4列
a[0,0,1] = 8; //给第0页,第0行,第一列赋值8
存储方式
多维数组元素在内存中的排列顺序为: 第1维的下标变化最慢,最右边的下标变化最快。
字符数组
定义和引用
char c[4];
c[0]='I'; c[1]=' ';c[2]='a';c[3]='m'; //用来存放字符数据的数组是字符数组,在字符数组中的一个元素内存放一个字符。
int c[10]; //由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据
c[0]='a'; //合法,但浪费存储空间
printf(%c,c[0]) //引用字符数组元素
初始化
char c[10]={′I′,′ ′ ,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′} //把10个字符依次赋给c[0]~c[9]这10个元素
char c[10]={′c′,′ ′,′p′,′r′,′o′,′g′,′r′,′a′,′m′} //初值个数若大于数组长度则报错,否则只赋予给前面的元素,后面的元素值为'\0'
char c[]={′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′}; //数组长度自动设为10
char diamond[2][5]={{′ ′,′ ′,′*′},{′ ′,′*′,′ ′,′*′}}; //字符型二维数组
字符串结束标志
″C program″ 字符串是存放在一维数组中的,占10个字节,字符占9个字节,最后一个字节′\0′是由系统自动加上的。
char c[10]={"China"}; //数组c的前5个元素为: ′C′,′h′,′i′,′n′,′a′,第6个元素为′\0′,后4个元素也自动设定为空字符
char c[5]= "China"; //错误,数组长度应该改为6,要多存放一个'\0',但是字符串长度不包括'\0'
char c[6] = "China"; //正确
printf("%s", c);
可以使用二维字符数组来存储多个字符串
include <stdio.h>
int main()
{
char i[3][10] = { "haha","hello" };
printf("%s\n", i[1]); //输出hello
printf("%c\n", i[0][0]); //输出h
}
输入和输出
include <stdio.h>
int main()
{
char c[]="China";
printf("%s\n",c); //输出China,%s表示对字符串的输出,对应的输出项应是数组名
return 0;
}
char c[6];
scanf("%s",c); //从键盘输入China,系统会自动在China后面加一个′\0′结束符
/*在C语言中数组名代表该数组第一个元素的地址*/
char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3); //键盘输入how are you,空格作为间隔符,分别将'how','are','you'赋予给以上三个数组
char str[13];
scanf("%s",str); //键盘输入how are you,由于空格是字符串间隔符,所以只赋值了'how'
printf("%o",str); //用八进制形式输出数组str的起始地址
字符串处理函数
puts
puts
函数是 C 语言中的一个标准库函数,它用于将一个字符串写入到标准输出(通常是屏幕
include <stdio.h>
int main()
{
char str[]={"China\nBeijing"}; //puts函数可以输出转义字符
puts(str); //在用puts输出时将字符串结束标志′\0′转换成′\n′,即输出完字符串后换行
return 0;
}
gets
gets函数是一种读取字符串的C语言函数。它从标准输入(通常是键盘)读取一行字符串,并将其存储到字符数组中
它以字符串作为参数,并将读取的字符串复制到这个字符数组
int main() {
char c[10];
gets(c); //若键盘输入hello,则将此字符串送给数组c,共有6个字符,而不是5个
} //执行后会返回字符数组的起始地址
strcat
strcat函数是字符串函数,它是用于将源字符串追加到目标字符串的尾部
include <stdio.h>
include <string.h> //导入stract函数
int main() {
char str1[30] = { "People′s Republic of " }; //str1数组长度要足够大
char str2[] = { "China" };
strcat(str1, str2); //将str2的字符串接到str1的字符串后面,再赋值给str1数组
printf("%s", str1); //输出:People′s Republic of China
}
strcpy
strcpy函数是 C 语言中的一个字符串函数,是用来把一个字符串复制到另一个字符串的, 它的语法格式如下
strcpy(char *dest, const char *src);
其中,参数 dest 是目标字符串,参数 src 是源字符串。strcpy 函数会将 src 字符串的内容复制到 dest 字符串的内存中,并在复制完成后,返回 dest
使用实例如下:
include <stdio.h>
include <string.h>
int main() {
char str1[15]="1234567", str2[] = "China";
strcpy(str1, str2); //将str2的字符串复制到str1里去
printf("%s", str1); //输出China,完全覆盖掉原先str1里的字符串
}
strncpy
strncpy
函数与strcpy
函数不同的是, 它可以将源字符串的前n个字符复制到目标字符串中
include <stdio.h>
include <string.h>
int main() {
char str1[15]="1234567", str2[] = "China";
strncpy(str1, str2, 2); //将str2字符串的前两个复制到str1里
printf("%s", str1); //输出Ch,完全覆盖
}
strcmp
strcmp
函数是一个字符串比较函数,它接收两个参数:两个字符串字符数组,并将它们进行比较
include <stdio.h>
include <string.h>
int main() {
char str1[15]="faker", str2[] = "China";
int result = strcmp(str1, str2); //比较str1和str2的字符串,依次按照ASCII码比较
printf("%d", result);
/*str1 = str2,则result=0
str1 > str2,则result为正整数
str1 < str2,则result为负整数
*/
}
strlen
strlen
函数用来获取字符串长度
include <stdio.h>
include <string.h>
int main()
{
char str[10]="China";
printf("%d,%d\n",strlen(str),strlen("China1")); //strlen输出字符串长度,不包括\0,这里输出5,6
}