数组
-
数组的定义
-
数组是一组数据的集合,用于将一种类型的数据存储到一段连续的空间中,可在一定程度上面加快搜索速度。
-
组成数组的元素是若干个独立的变量,这些变量的类型必须相同。
-
按照数组元素的类型的不同又可以分为:数值数组、字符数组、指针数组、结构体数组等。
-
数组属于构造类型。
<存储类型> <数据类型> <数组名> [<常量表达式>]
-
数组的类型实际上说的是数组元素的类型,其所有的元素数据类型是相同的。
-
数组名不能与其他变量同名。
-
数组结构与存储大小
数组的存储空间在内存中是连续的,会根据数组元素的个数,来分配数组的大小
数组的大小 = 数组元素的 *数组元素的个数;
数组名用于记录数组首元素的地址,可以通过数组名来获取数组首元素的地址
-
-
一维数组
一维数组的定义
数据类型 数组名[常来那个表达式]
-
[]:优先级是最高的,而且具有右结合性。
-
数组的存储空间在物理上是连续的,所以访问数组的元素可以通过收元素的地址就加偏移量来访问。
数组元素的地址 = 数组收元素的地址 + 下标 + 数组元素的大小
-
若数组定义时指定n个元素,则数组下标的范围是0~n-1;
-
注意:千万不能出现数组越界访问的问题,数组越界访问相当于内存访问越界,后果不可预知。如:定义 int a[n] = {0};却去访问a[n],就发生了越界,访问了未知内存
一维数组初始化
-
1.局部数组不初始化
对于普通局部数组,若定义时未初始化,则数组中未初始化元素的值是不确定的。
-
2.static数组不初始化
static数组若定义时未初始化,则数组中的元素值默认为0。
-
3.全局数组不初始化
数组中的元素也会默认为0;
-
4.全部初始化
注意在对数组进行初始化使只能放在一行。
如:
int a[10] = {0,1,2,3,4,5,6,7,8,9,};
这样写就是错的:
int a[10];``a[10] = {0,1,2....}
后面一句相当于是对数组调用,显然是错误的。
数组初始化的复制方式只能用于数组的定义,定义之后再赋值只能一个一个元素的赋值
-
5.部分初始化
当{}中元素的个数小于元素的个数时,之后前面的元素赋值,后面的元素自动为0。
利用该性质,将数组清0,如:
a[10]={0}
-
6.数组全部赋值
若对数组中元素全部赋值则可以省略下标。
-
7.数组全部初始化为0
a[10] ={0}
;使用循环;
使用库函数memset库函数:memset(数组名,初始化的值,素组大小);
使用库函数bzero,将数组清零,头文件strings.h
bzero(数组名,数组大小);
一维数组的内存分配
- 数组元素的个数:
数组元素个数 = sizeof(数组名) /sizeof(数据类型)
-
-
多维数组
-
定义形式:
<存储类型> <数据类型> <数组名> <常量表达式> <常量表达式2>...<常量表达式n>
多为数组知识增加了下标,其特性与一维数组基本相同。
二维数组
-
二维数组初始化
-
1.降维给二维数组初始化,即按行初始化,每一组的初始值都用{}括起来。
如:
a[2][3] = {{1,2,3},{4,5,6}};
-
2.按照线性存储给二维数组初始化
如
a[][] = {1,2,3,4,5,6;
-
3.可以省略左边下标的方式,给二维数组初始化
如:
a[][3] = {1,2,3,4,5,6}
注意:第二维的长度不能省略
-
-
二维数组的内存分配
- 二维数组给我们平面的形式(行,列)但是实际上,二维数组也是在内存中也是连续的。即二维数组采用了和一位数组类似的存储方式。
- 扩展:
二维数组一维数组为元素
-
-
字符数组
-
字符数组的定义
有一定顺序关系的若干个字符变量的集合,就是字符数数组。
-
字符数组初始化
-
1.和普通数组相同,逐个进行初始化
如:
char a[5] = {'','','','',''}
char b[][4] = {{'a','b','b','\0'},{'q','w','e','\0'}}
-
-
字符数组初始化
-
1.逐个赋值
-
2.使用字符串常量
char a[6] ="hello";
字符串以\0,内存访问不能越界。利用字符串初始化字符数组的时候会默认加上\0。
-
-
-
字符串
- 在C于艳红没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
- 存放一个字符串时,编译器会自定加上’\0’作为结束标志。
- 当一scanf函数输入字符串时,一空格作为字符串的结束符。
字符串处理函数:
-
1.字符串拷贝函数
char *strcpy(char *dest,const char *src)
-
2.字符串连接函数
char* strcat(char* dest,const char* src)
经字符串src连接到字符串dest的后面。
-
3.字符串比较函数
int strcmp(const char* s1,const char* s2)
- 字符串相等,返回值为0
- 字符串1>字符串2,返回值>0
- 字符串1<字符串2,返回值<0
-
4.求字符串长度
size_t strlen(const char* s)
- 返回字符串的长度,不包括\0
-
5.字符串分界函数
char* strtok(char* s,const char* delim)
- 功能:将字符串分解成一个个片断
- 参数:s为要分解的字符串,delim为分隔符字符串
- 返回值:分解出的字符串的地址
-
注意点
- 当程序中,需要用户输入一个字符串时,字符串输入函数gets,没有输入长度限制,若用户输入的字符太多会发生内存越界。