一、一维数组
1.1基本概念
-
数组:元素类型相同的数据集合
-
一般形式:
数据类型 数组名称 [ 数据长度 ];
- 数组长度必须是大于0的整型字面值(不可以是小数,不可以是变量)
- 数组名必须是满足C语言要求的合法标识符(由数字,字母,下划线组成,数字不可以打头,不可以是关键字)
- 数组的元素类型可以是基本类型(char、int、double…),也可以是构造数据类型(数组、结构体、枚举体、联合体)
-
数组中的元素在内存中是连续存储的
-
int a[10]://表示定义了一个长度为10,元素类型为int,名称为a的数组。
-
int a[10]://相当于同时定义了10个int类型变量
1.2数组的使用(数组元素的访问)
-
访问数组中的元素通过 [ ](下标)来访问
-
一个长度为n的数组,下标的合法访问范围为 0~n-1
-
[ ] 在数组定义语句当中,表示数组长度
-
[ ] 在访问数组语句当中,表示元素下标
-
当下标的值超过数组合法下标范围时,这种情况称为下标访问越界
-
代码
int arr[5]; printf("%d\n", sizeof(arr)); // 20 printf("%d\n", sizeof(arr[0])); // 4 printf("%d\n", sizeof(arr)/sizeof(arr[0]));// 5
-
1.3数组的初始化
-
初始化:变量在分配内存的同时指定初始值
-
数组的初始化就是给数组分配内存的同时指定数组每个元素的值
-
数组的初始化时通过初始化列表完成的
代码:int arr[5] = {1,2,,3,4,5};
-
如果数组没有进行初始化,数组元素的值是随机值
1.3.1全部初始化
- 数组长度和初始化列表元素个数相同
- int arr[5] = {1,2,3,4,5}
1.3.2部分初始化
- 初始化列表元素个数小于数组长度
- 代码:int arr[5] = {1,2,3};
- 代码:arr[0]=1 arr[1]=2 arr[2]=3 arr[3]=0 arr[4]=0;
- 首先按照初始化列表元素顺序依次赋值给数组每个元素,没有赋值的元素默认初始化为0
- 代码:int arr[1000] = {0}; // 数组所有元素初始化为0
1.3.3省略长度初始化
- 在定义数组的时候如果使用初始化列表进行初始化,而初始化列表元素个数与数组长度刚好相同时,此时可以省略数组长度
- int arr[5] = {1,2,3,4,5};
- 等同于 int arr [] = {1,2,3,4,5};
二、字符数组与字符串
2.1基本概念
-
字符数组:元素类型为char的一维数组
- char arr[10];
-
C语言中并没有string类型,通过字符数组来实现字符串的存储与操作。
-
char str[] = “abcd”; // {‘a’, ‘b’, ‘c’, ‘d’, ‘\0’}
- 里面是字符串字面值,但是有五个字符 // {‘a’,‘b’,‘c’,‘d’,’\0’,0,0,0}后面的0是机器初始化的,前面的\0是转义字符
-
str数组的长度(相当于字符个数)是5,字符长度是4(第一个\0前面的字符数)
-
C语言允许使用字符串字面值来初始化字符数组
-
-
给定一个字符数组,怎么判断其存储的是否是字符串
-
只需要判断其中是否有’\0’
-
char str[] = “”; //是字符串,因为有\0,从字符数组角度来看,str长度是1;从字符串角度来看,str字符串长度是0
-
代码:
char str1[5] = {'a','b','c','d','e'}; char str2[5] = {'a','b','c','d'}; char str3[] = "abcd"; char str4[5] = "abcde";
-
str1不是字符串,没有’\0’
-
str2是字符串
-
str3是字符串
-
str4数组访问越界
-
-
字符个数:所有字符的个数
-
字符串长度:第一个’\0’之前字符个数
-
2.2字符串的输入输出
-
scanf()/printf():通过
%s
来进行字符串的输入和输出- scanf
在读取字符串
可以不用加取地址符(&)(只针对’%s
’),因为str代表字符串数组的时候已经把地址传过去了 - scanf 遇到空格和换行表示读取结束,刚开始读取遇到空格和换行(遇到前导空格和换行)会跳过,从非空格和换行的字符开始读取
- scanf()在读取字符串时,不会读取空格和换行,剩余空格或换行如果对之后读取产生垃圾数据时,可以收到读取垃圾数据(getchar()),也可以清空输入缓存区(fflush(stdin))
- scanf
-
代码
char str[100] char c; scanf("%s",str); scanf("%c",&c); printf("%s\n",str); printf("---%c---\n",c);
-
修正
-
修正一:
char str[100] char c; scanf("%s",str); scanf("%c",&c);//getchar() 读取无效 scanf("%c",&c); printf("%s\n",str); printf("---%c---\n",c);
-
修正2:
char str[100] char c; scanf("%s",str); fflush(stdin);//清空输入缓存 scanf("%c",&c); printf("%s\n",str); printf("---%c---\n",c);
-
-
-
gets()和puts()
- gets()直接读取一整行数据作为字符串,包括空格
- puts()打印字符串,并在末尾添加一个换行’\n’
- 例子:puts(""); //表示换行
2.3 C语言中字符串处理函数
-
C语言提供了一系列关于字符串的方法,在
<string.h>
-
strlen():获取字符串长度
-
例子:
char str[] = "nihao"; printf("%d\n", strlen(str)); printf("%d\n", strlen("hahaha"));
-
-
strcpy():字符串拷贝(字符串赋值)
-
例子:
char str1[100] = "hello"; char str2[100] = "nihao"; char temp[100]; strcpy(temp, str1); strcpy(str1, str2); strcpy(str2, temp); puts(str1); puts(str2);
// 第一个参数必须保证是字符数组,并且字符数组长度足够长(比第二个参数的字符串长度+1长)
-
-
strcmp():字符串比较
-
0:相等
-
1:第一个参数大
-
-1:第二个参数大
-
例子:
char str1[100] = "hello"; char str2[100] = "nihao"; printf("%d\n", strcmp(str1, str2)); // -1 printf("%d\n", strcmp(str1, str1)); // 0 printf("%d\n", strcmp(str2, str1)); // 1
-
-
strcat():字符串拼接
-
例子:
char str1[100] = "hello"; char str2[100] = "nihao"; strcat(str1, str2); puts(str1); // hellonihao
-
三、二维数组
3.1基本概念
-
二维数组:存放一维数组的一维数组
-
一般形式:类型 数组名 [行数][列数];
-
int arr[3][4];
-
3行4列的二维数组。
-
长度为3的一维数组,里面每一个元素是长度为4的整型一维数组。
/* arr[0][0] arr[0][1] arr[0][2] arr[0][3] arr[1][0] arr[1][1] arr[1][2] arr[1][3] arr[2][0] arr[2][1] arr[2][2] arr[2][3] 11 12 13 14 21 22 23 24 31 32 33 34 */ int arr[3][4]; int i, j; for (i=0; i<3; ++i) { for (j=0; j<4; ++j) { arr[i][j] = (i+1)*10 + (j+1); } } for (i=0; i<3; ++i) { for (j=0; j<4; ++j) { printf("%d ", arr[i][j]); } puts(""); }
-
3.2二维数组的初始化
3.2.1按行初始化
-
例子:1、嵌套式初始化列表
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int arr[3][4] = {{1,2,3}, {5,6}, {7}} /* 1 2 3 0 5 6 0 0 7 0 0 0 */ int arr[3][4] = {{1,2,3}, {5,6}}; /* 1 2 3 0 5 6 0 0 0 0 0 0 */
3.2.2整体初始化
-
例子:1、会逐行放入,剩下有多余的位置会初始化成0
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; /* 1 2 3 4 5 6 7 8 9 10 11 12 */ int arr[3][4] = {1,2,3,4,5,6,7}; /* 1 2 3 4 5 6 7 0 0 0 0 0 */
3.2.3特殊初始化(省略长度初始化)
-
二维数组在定义时,如果指定初始化列表,则
可以省略行数,但不可以省略列数
-
换一种思路理解,相当于省略二维数组的个数,但是二维数组中的一维数组的个数不可以省略
int arr[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int arr[][4] = {1,2,3,4,5,6,7};