数组
一、什么是数组?
数组是由一些有顺序的相同类型的变量组成的。数组本质是复合类型。
二、数组的定义
数据类型 数组名[成员个数];
三、如何为数组赋值
数组是不能整个赋值的,需要给每一个元素赋值。例如:int a[3]; a[0] = 1;
由于数组中所有元素的地址是连续的,并且是有次序的,所以访问每一个元素就可以通过下标值访问.a[0]就是数组中的第一个元素
四、初始化
一般定义的同时初始化,如:
int a[3] = {1,2,3};
此时,a[0] == 1,a[1] == 2, a[2] == 3;
若定义的时候没有进行初始化,则数组的成员默认值为0
五、数组名
数组名就是数组的起始地址,也可以说数组名指向首地址
数组名是一个常量,不能进行加减乘除自增自减运算。一旦数组定义完成,数组起始地址就确定了,永远也不会改变。
sizeof(数组名) 得到的是整个数组所占存储空间大小。例如:int arr[3]; sizeof(arr)所占的存储空间大小是3 * sizeof(int)的大小,也就是12个字节。
六、字符数组和字符串
1.什么是字符串?
字符串是由0个或更多的字符组成的,连续的存储的,由'\0'作为终止字符的数据类型。字符串被两个双引号引起来
2.字符数组
字符数组多用于存储字符串,c语言中没有字符串变量类型,如果想要存储字符串变量只能用字符数组.
3.字符数组的初始化
例子:
- char s1[10] = "hello";数组s1存储的是字符'h' 'e' 'l' 'l' 'o' '\0' '\0' '\0' '\0' '\0'
- char s2[5] = "hello";首先编译器不检查数组越界,所以不会报错,但是已然越界了。
- char s5[5] = {'h', 'e', 'l', 'l', 'o'}; 这个没问题的,但是不是字符串
- char s3[10] = {"hello"}; 语法是对的同i
- char s4[10] = {'h', 'e', 'l', 'l', 'o'}; 同i
4.字符串函数
- strlen(3) 求字符串长度
- strcpy(3) 字符串的复制
- strcat(3) 字符串的拼接
- strcmp(3) 字符串的比较
- strstr(3) 字符串中找子串
- strchr(3) 字符串中找字符
- strsep(3) strtok(3) 字符串切割
- 学习看函数手册 man 3
(3的意思是手册3)
5.类型
- char c[5]; &c取得c数组的地址,类型是char *
- 类型决定运算, 所以char *运算能力是sizeof(char),int *的运算能力是sizeof(int)
- char s[] = "hello";
数组名s是这个数组的起始地址,也就是&s[0],所以s+1是就是第二个元素的地址,下标为1。
数组s类型是char *, 数组s的运算能力是sizeof(char)也就是1
在c有一个取值运算符是*,*(s + 1)是从s+1这个地址取得1个字节,也就是数组的第二个元素。在c中还有一个取值运算符是[].那么*(s+1)还可以表达为s[1]或者1[s]
取值运算符是*和[]
七、多维数组
多维数组也就是数组的成员是一个数组,常见的多维数组为二维数组
二维数组的成员是一维数组
例如:
int a[2][3]; a数组中有2个元素,每1个元素是有3个int类型变量组成的一维数组
存储
二维数组中所有的元素地址都是连续的,二维仅仅是一种表达形式
a这个数组中共有6个int类型的变量,这6个元素的地址是连续的
取得二维数组中的元素a[i][j] , *(a[i] + j), *(*(a + i) + j)
二维数组的第一个中括号内可以省略