思维导图链接boardmix
【1】数组的概念
数组:一种 内存连续 ,且存储一组 数据类型相同 的数据结构。
数据类型 变量名[数组容量];
int arr1[3]; //申请了一个数组,数组中的每一个元素都是int类型,共3个int类型变量,数组占:3*4bytes = 12bytes;
char arr2[8]; //申请了一个数组,数组中的每一个元素都是char类型,共8个char类型变量,数组占:8*1bytes = 8bytes;
注意:
- 数组容量只能是整型常量
- ps:在标准的C中可以是整型变量,但是不建议使用。因为在很多编译器上不兼容该规则。
sizeof(数组名); 计算一个数组的大小
//初始化格式
int arr2[3] = {1,2,3}; //全部初始化
int arr3[3] = {1,2}; //部分初始化,初始化前面部分,后面默认初始化为0
int arr4[3] = {0}; //初始化前面部分,后面默认初始化为0,即全部为0
int arr5[] = {1,2,3,4,5}; //容量不定义,数组容量跟着数据个数决定:5
//int arr6[]; //错误的,因为编译器不知道要申请多少个字节
//int arr5[3] = { , 2, 3}; //错误的,前面部分不能省略
int arr2[3] = {1,2,3};
arr2[0] --->下标为0的元素的空间---> 存储的是数据1;
arr2[1] --->下标为1的元素的空间---> 存储的是数据2;
arr2[2] --->下标为2的元素的空间---> 存储的是数据3;
for(i=0; i<5; i++)
{
scanf("%d", &arr[i]); //从终端获取数据
}
for(i=0; i<5; i++) //遍历数组:通过循环的方式访问数组中的每一个元素
{
printf("%d\n", arr[i]);
}
字符串常量:用双引号括出来的一个或多个字符。"12345"
%s
char str1[5] = {'h', 'e', 'l', 'l', 'o'}; --->普通字符数组
char str2[9] = {'h', 'e', 'l', 'l', 'o'}; --->字符串,因为'o'字符后面后'\0'
"hello" ---> 'h' 'e' 'l' 'l' 'o' '\0'
字符数组 和 字符串有什么区别?
- 字符串是存储在字符数组中的
- 字符串必须以'\0'结尾,字符数组不需要。
初始化:定义变量的同时赋值
C语言中没有专门用于存储字符串的数据类型,我们将其存储在字符数组中,且以'\0'字符结尾。
char arr1[10] = {'h', 'e', 'l', 'l', 'o'}; //初始化前面部分,后面默认初始化为0
char arr2[10] = "hello"; //用hello字符串给arr2赋值, 给arr2赋了6个值,后面默认初始化为0
char arr3[10] = ""; //""中即使什么都不写,也肯定会有一个'\0'存在,后面默认初始化为0,
//所以会将整个数组初始化为0
char arr4[] = "hello"; //缺省容量,跟着后面数组来定,容量是6,后面有个'\0'
char arr5[] = ""; //""中即使什么都不写,也肯定会有一个'\0'存在, 所以容量是1
sizeof(数组名); 计算一个数组的大小
char str[32] = "hello";
sizeof(str); ====> 32bytes 共32个char类型元素
char str[32] = "hello";
printf("%s", str); ---》打印字符串只需要填字符数组名字即可
%s: 从字符串的首元素开始打印,直到遇到'\0'字符停止。
int a;
scanf("%d", &a);
char str[32];
scanf("%s", str); //注意,不需要加&符号;
注意:
- scanf后面跟的字符串的数组名,不需要加&
- %s一次只能识别到 空格,tab, 换行之前,且不会获取空格,tab, 换行
char str[32] = "hello world";
printf("%s\n", str);
puts(str); 打印str字符串,并换行
char str[32];
gets(str); //获取字符串,存储到str空间内;
警告: the `gets' function is dangerous and should not be used.:gets没有越界保护,忽略这个警告
注意:
- gets会获取空格,会获取'\n',及制表符
头文件:
#include
strlen 求字符串长度
strcpy 字符串拷贝
strcmp 字符串比较
strcat 字符串拼接
bzero 清空字符串,将字符串全部清成'\0'
memset 内存置位
功能:求字符串长度,到'\0'位置为止,且不包含'\0';
格式:
strlen(字符串数组名字);
例子:
char str[32] = "hello";
sizeof(str); ====> 32bytes 共32个char类型元素
strlen(str); ====> 5 bytes
printf("strlen:%ld\n", strlen(str));
sizeof和strlen有什么区别?
- sizeof是计算所要建立的变量的空间大小。
- strlen是计算字符串的长度,到'\0',且不包含'\0'
- sizeof是运算符,而strlen是函数。
- sizeof是在编译时就计算好的,而strlen是在程序运行到该位置的时候,才计算的。
功能:字符串拷贝; 将str1的内容拷贝给str2,到'\0'位置,且会将str1的'\0'拷贝给str2.
注意:两个字符串的容量可以不相同,因为我们是以'\0'作为结束标识
strcpy(字符串str2, 字符串str1);
例子:
char str1[128] = "hello";
char str2[100] ;
strcpy(str2, str1);
printf("%s\n", str2);
功能:比较两个字符串的大小;
格式:
strcmp(str1, str2);
若str1大于str2,则strcmp会返回大于0
若str1等于str2,则strcmp会返回等于0
若str1小于str2,则strcmp会返回小于0
注意:
- 字符串的大小比较于字符串的容量无关;
- 从str1和str2的下标0位置开始依次往后比较,
- 当比较到的数据不相同的时候,会停止比较输出结果。
- 当两个字符串同时结束,即同时比较到'\0',停止比较输出结果:两个字符串相等。
功能:字符串拼接,将str2拼接在str1后面;
格式:
strcat(str1, str2);
功能:将字符串空间内的所有字符都清为0; 即'\0'
格式:
char str[32] ;
bzero(str, sizeof(str)); 指定将sizeof(str)这么多个字节的空间内的数据全部置位0
功能:内存置位,会将数据以字节为单位,置位指定的数值;
char str[128];
memset(str, 0, sizeof(str)); 将str中sizeof(str)个空间中的每一个字节都置为0。
memset(str, 0, sizeof(str)); 等价于 bzero(str, sizeof(str));
memset(str, 1, sizeof(str)); 将str空间中的每一个字节都置为1.
注意:memset是将每一个字节置为指定数据
数组:一种 内存连续 ,且存储一组 数据类型相同 的数据结构。
一维数组:数据类型 数组名[容量]; int arr[12];
二维数组:数据类型 数组名[行数][列数];
int arr[3][4]; 申请了一个int类型的二维数组,共3行4列=12个元素,共12*4bytes = 48byte;
char brr[7][8]; 申请了一个char类型的二维数组,共7行8列=56个元素,共56*1bytes = 56byte;
注意:二维数组每个元素在内存中依然是相邻的
sizeof(数组名)
int arr[3][4];
sizeof(arr); ---->48bytes
初始化:定义变量的同时赋值
int arr[3][4]; //随机值
int arr1[3][4] = {90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101}; //全部初始化
int arr2[3][4] = { //全部初始化
{90, 91, 92, 93},
{94, 95, 96, 97},
{98, 99, 100, 101}
};
int arr3[3][4] = {90, 91}; //部分初始化,初始化前面部分,后面默认初始化为0
int arr4[3][4] = {0}; //部分初始化,初始化前面部分,后面默认初始化为0
int arr5[3][4] = {
{90, 91},
{94},
{95}
};
int arr6[][4] = {90, 91, 92, 93, 94}; //正确,2行4列
/*
//错误的
int arr6[][]; //错误的,不知道要申请几个字节
int arr6[][] = {90, 91, 92, 93, 94}; //错误的,不知道几行几列
int arr6[4][] = {90, 91, 92, 93, 94}; //错误的,因为无法通过行数推出几列
*/
- 通过下标的方式访问,下标从0开始编号。
- 行号:0 ~ 行数-1
- 列号:0 ~ 列数-1