数组
- 1、什么是是数组
- 2、数组的定义
- 2.1数组的表达
- 2.2数组的含义
- 2.3数组的大小:
- 3. 字符数组
- 4.字符串操作
- 5.二维数组
1、什么是是数组
数组是指有序的元素序列。如果将有限个类型相同的变量的集合命名,那么这个名称就是数组名,而组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
简而言之,数组就是有限个相同类型变量的有序序列。数组中的数据按着一定的方式存储到空间
2、数组的定义
再讲数组前先引进一个概念:基本数据类型和构造数据类型
基本数据类型包括:整型(short,int,long)、实型(又称浮点型)(float和double)、字符型char、布尔型bool等。
构造数据类型包括:数组类型、枚举类型enum、指针类型、引用类型、结构体struct、联合体union(又称联合,共用体)、类class等。
构造数据类型指可以通过其他的数据类型进行构造,可由程序员自定义,故又称为 “自定义数据类型”。
今天所学的数组属于构造数据类型
2.1数组的表达
数组:数据类型 数组名[数组长度];
数组的定义(以int类型的数组举例):
1、int a[5] (定义数组但不赋值)
2、int a[5] = {0,1,2,3,4} (定义数组但不赋值)
3、int a[] = {0,1,2,3,4} (不写下标但给数组赋值)
3、int a[5] = {0,1,2} (部分赋值)
5、int a[] (这个对不对呢?)
我们测试一下a[]的定义会发现报错 "array size missing in ‘a’"这是告诉我们不知道数组的大小,所以5是错误的
我们比较上面4个,我们会发现,在定义的时候我们都可以知道数组的大小,如3没有直接说明,但3给数组赋值了,我们可以知道这个数组有5个元素。
注意:数组定义后,数组的大小是不能修改的。就相当于我们做好了一个元器件盒子了,实物已经做出来我们就没办法改变盒子的容量了。
数组中元素的表达:数组名[下标];
下标:下标就是数组中元素的位置距离首地址的偏移量
int a[5] = {0,1,2,3,4}
- 数组中第n (n<=5)个元素的表达:数组名[n-1]
- 数组中第一个元素的地址表达:&数组名[0] , 数组名(数组名也是地址)
- 给第n个元素赋值:a[n-1] = x;
- 输出下标为i的元素内容:printf("%d",a[i]);----将数组中第i+1个数据打印到我们屏幕上
- 数组空间连续,地址也是连续
2.2数组的含义
数组构造的类型:
- 构造一个数组类型,存储多个字符数据
字符数组 char 数组名[数组长度] - 构造一个数组类型,存储多个整型数据
整型数组 int 数组名[数组长度] - 构造一个数组类型,存储多个浮点型数据
浮点型数组 float 数组名[数组长度] -/- double 数组名[数组长度]
2.3数组的大小:
数组大小 = 数组类型*数组长度
int a[3] sizeof(a) = 6 / sizeof(a) = 12
char a[3] sizeof(a) = 3
float a[3] sizeof(a) = 12
double a[3] sizeof(a) = 12
3. 字符数组
- 定义一个数组a,里面可以存放100个字符 char a[100];
- 数组a的大小:100
- 特点:空间连续,地址连续
- 数组中首地址:a // &a[0 ]// &a
- 数组元素输入、输出:%c
- 字符数组中允许用户一次输入多个字符:%s
scanf("%s",存放多个字符的首地址);%s 就是字符串的输入(遇见回车或者是空格结束输入)
printf("%s",输出字符的首地址);---------遇见\0字符,就停止输出
%s格式控制符:针对于字符串
什么是字符串?多个字符的集合,字符串有一个结束标志’\0’,常用:“”引起来
字符数组的初始化
1.1 全部初始化 char a[5]={‘a’,‘b’,‘c’,‘d’,‘e’};-------字符数组
char a[5]={“abcd”};-----字符串数组
char a[5]=“abcd”;------字符串数组
1.2. 部分初始化 char a[5]={“a”}; 没有初始化的元素默认为’\0’
数组空间清0:char a[5]={’\0’};
1.3. 省略数组长度进行初始化
char a[]={‘a’,‘b’,‘c’,‘d’,‘e’};
char b[]="abcde“
4.字符串操作
1 strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2 strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3 strlen(s1);
返回字符串 s1 的长度。
4 strcmp(s1, s2);
比较字符串,如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5 strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6 strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
int main ()
{
char str1[14] = "runoob";
char str2[14] = "google";
char str3[14];
int len ;
/* 复制 str1 到 str3 */
strcpy(str3, str1);
printf("strcpy( str3, str1) : %s\n", str3 );
/* 连接 str1 和 str2 */
strcat( str1, str2);
printf("strcat( str1, str2): %s\n", str1 );
/* 连接后,str1 的总长度 */
len = strlen(str1);
printf("strlen(str1) : %d\n", len );
return 0;
}
结果:
strcpy( str3, str1) : runoob
strcat( str1, str2): runoobgoogle
strlen(str1) : 12
5.二维数组
定义: 数据类型 数组名[行长度][列长度];
表达:定义一个 空间 存放3个一维整型数组(每个整型数组都有5个元素)
int a[3][5];
大小:sizeof(a)= sizeof(数据类型)行长度列长度=60
元素: 数组名[行下标][列下标]
元素的地址:& 数组名[行下标][列下标]
理解:
二维数组其实就是多个一维数组的组合我们此处可以引入一个格子来说明,如下图所示。
我们假设这个二位数组的起始地址为0x00,则地址的变化为上图箭头所示,如果数组类型是char的话,占据一个格子,为int类型的话占据2/4个格子,我们此处以char类型来说明。
按照上面的格子我们可以知道此处定义的是char [8][4]的数组,此二维数组是有8个char [4]的一维数组组成。
二维数组中空间连续,地址也是连续。
二维数组首地址: a / &a / &a[0][0] / a[0]
一维数组的首地址可以用a表示
二位数组的第n维的首地址可以用a[n]来表示
思考题
一维数组int a[5],地址a和地址&a的区别是什么?a+1 和 &a+1一样吗?
int main()
{
int a[5];
printf("a = %p,&a = %p\n",a,&a);
printf("a+1 = %p,&a+1 = %p\n",a+1,&a+1);
return 0;
}
结果:
a = 0x7fffe3772f20,&a = 0x7fffe3772f20
a+1 = 0x7fffe3772f24,&a+1 = 0x7fffe3772f34
比较比较a与a+1的偏移量和&a与&a+1偏移量可以发现
a与a+1的偏移是一个int类型的大小,&a与&a+1的偏移是int [5]的大小
如果是二位数组呢?int b[3][5]
二维数组的b[0]和&b[0]也可以理解为一维数组的a和&a(可以用程序验证下)
int main()
{
int a[5];
int b[3][5];
printf("a = %p,&a = %p\n",a,&a);
printf("a+1 = %p,&a+1 = %p\n",a+1,&a+1);
printf("b[0] = %p,&b[0] = %p\n",b[0],&b[0]);
printf("b[0]+1 = %p,&b[0]+1 = %p\n",b[0]+1,&b[0]+1);
return 0;
}
结果:(自己比较想想)
a = 0x7ffe8b1e2920,&a = 0x7ffe8b1e2920
a+1 = 0x7ffe8b1e2924,&a+1 = 0x7ffe8b1e2934
b[0] = 0x7ffe8b1e28e0,&b[0] = 0x7ffe8b1e28e0
b[0]+1 = 0x7ffe8b1e28e4,&b[0]+1 = 0x7ffe8b1e28f4
**如果是b和&b的区别呢?**想想看程序运行的结果和你想的一样不
int main()
{
int b[3][5];
printf("b = %p,&b = %p\n",b,&b);
printf("b+1 = %p,&b+1 = %p\n",b+1,&b+1);
return 0;
}
结果:
b = 0x7ffd5cfdfe40,&b = 0x7ffd5cfdfe40
b+1 = 0x7ffd5cfdfe54,&b+1 = 0x7ffd5cfdfe7c
/***********************************
0x7c-0x40 = 40个字节
(3+5)*4 = 40;
**********************************/
b和b+1是一个int [5]的大小 &b和&b+1是int [3][5]的大小。
自己思考思考理解理解,这点知识对你学后面的指针是很用帮助的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)