============================
2022-7-26
============================
一.温故知新
多维数组
二维数组
可以存储多个相同类型的数据
可以抽象成有行有列的形式
数据类型 数组名[行数][列数];
int arr[2][3];
一共有6个成员
arr[0][0] arr[0][1] arr[0][2]
arr[1][0] arr[1][1] arr[1][2]
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
现在想要找出数值为7的成员
数组名 + 下标 arr[1][1]
数组名 + 偏移量 *(*(arr + 1) + 1)
通过sizeof运算符计算
int arr[3][5];
sizeof(arr[0][0]) = 4 = 一个成员的大小
sizeof(arr[0]) = 20 = 一行的大小
sizeof(arr) = 60 = 整个数组的大小
sizeof(arr)/sizeof(arr[0][0]) = 15 = 成员个数
sizeof(arr)/sizeof(arr[0]) = 3 = 行数
sizeof(arr[0])/sizeof(arr[0][0]) = 5 = 列数
通过打印每个成员的地址发现
二维数组的成员也是占用了连续的存储空间
二维数组的数组名相当于是数组首行的地址
(一维数组的数组名相当于是数组首成员的地址)
字符数组和字符指针
在C语言中没有字符串类型
在C语言中需要使用字符数组来存储字符串数据
字符数组
1.字符数组的含义
是用来存储一组字符数据的
2.字符数组的定义
数据类型 数组名 [成员个数] ;
char arr [10] ;
3.字符数组的初始化
数据类型 数组名 [成员个数] = {数值,数值};
char arr[10] = {0};//给数组的10个成员都初始化成0
char arr[5] = {1,2,3,4,5};
char arr[5] = {'1','2','3','4','5'};
char arr[5] = {'\0'};
char arr[5] = {'0'};
char arr[10] = "easthome";
arr[0] = 'e' arr[1] = 'a' ... arr[7] = 'e'
arr[8] = '\0'
char arr[10] = {"easthome"};
注意 :
当通过scanf("%c")的方式给字符数组录入字符数据时
需要注意回车('\n'),因为回车会被当作换行符保存到
字符数组中
当通过scanf("%s")的方式给字符数组录入字符数据时
需要注意空格,因为空格会被当作字符串的截断标志
当通过scanf("%s")的方式给字符数组录入字符数据时
需要注意数组越界的问题
字符指针
1.字符指针的含义
字符指针也是指针,是用来保存地址的
2.字符数组和字符指针
char arr[10] = "easthome";
char *p = "easthome";
字符数组在初始化的时候,是把"easthome"字符串中的字符
一个一个的保存到字符数组的成员中
字符指针在初始化的时候,指针p是保存了"easthome"
这个字符串常量的首地址
C语言会把内存分为5大区域
栈区
堆区
常量区(read only)
全局区
代码区
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = {0}; int i = 0; int size = sizeof(arr) / sizeof(*arr);
for(i = 0; i < size; i++) { scanf("%c", &arr[i]); }
for(i = 0; i < size; i++) { printf("arr[%d] = %c\n", i, arr[i]); }
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = {0}; int i = 0; int size = sizeof(arr) / sizeof(*arr);
for(i = 0; i < size; i++) { scanf("%c", &arr[i]); }
for(i = 0; i < size; i++) { printf("arr[%d] = %d\n", i, arr[i]); }
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = {0}; int i = 0; int size = sizeof(arr) / sizeof(*arr);
scanf("%s", arr);
for(i = 0; i < size; i++) { printf("arr[%d] = %c-%d\n", i, arr[i], arr[i]); }
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = {0}; int i = 0; int size = sizeof(arr) / sizeof(*arr);
scanf("%s", arr);
printf("arr = %s\n", arr);
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = "easthome"; char brr[10] = {"easthome"};
printf("arr = %s\n", arr); printf("brr = %s\n", brr);
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = "easthome"; char *p = "easthome";
printf("arr = %s\n", arr); printf("p = %s\n", p);
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char arr[10] = "easthome"; char *p = "easthome"; printf("arr = %s\n", arr); printf("p = %s\n", p); p++; printf("p = %s\n", p); arr++; printf("arr = %s\n", arr);
return 0; }
|
常量区

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> #include <stdlib.h> #include <string.h>
int main(int argc, char *argv[]) { char src[10] = "easthome"; char dest[10] = {0};
printf("strcpy = %s\n", strcpy(dest, src));
return 0; }
|
/*
调用strcpy函数时,第一个参数必须是一个字符数组,
第二个参数可以是字符数组\字符指针\字符串常量
调用strcat函数时,第一个参数必须是一个字符数组,
第二个参数可以是字符数组\字符指针\字符串常量
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <stdio.h> #include <stdlib.h> #include <string.h>
int main(int argc, char *argv[]) { char *src = "embsky!"; char dest[32] = "embsky"; int ret = 0;
ret = strcmp("embsky", "easthome"); printf("ret = %d\n", ret);
return 0; }
|
/*
重新实现strcpy strcat strcmp strlen
字符串的结束标志是'\0'
1 2 3 4 5 6 7
| strncpy strncat strncmp
char dest[5] = "abc"; char *src = "Hello World!";
strcpy(dest, src); strncpy(dest, src, 5);
|
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include <stdio.h> #include <stdlib.h>
char *mystrcpy(char *dest, const char *src); char *mystrcat(char *dest, const char *src); int mystrcmp(const char *s1, const char *s2); size_t mystrlen(const char *s);
char *mystrcpy(char *dest, const char *src) { int i = 0; for(i = 0; src[i] != '\0'; i++) dest[i] = src[i]; dest[i] = src[i];
return dest; }
char *mystrcat(char *dest, const char *src) { int i = 0, j = 0;
for(i = 0; dest[i] != '\0'; i++) ; for(j = 0; src[j] != '\0'; i++,j++) dest[i] = src[j]; dest[i] = src[j];
return dest; }
int mystrcmp(const char *s1, const char *s2) { int i = 0;
for(i = 0; s1[i] == s2[i] && s1[i] != '\0'; i++) ; return s1[i] - s2[i]; }
size_t mystrlen(const char *s) { int i = 0;
for(i = 0; s[i] != '\0'; i++) ; return i; }
int main(int argc, char *argv[]) { char *src = "Hello"; char dest[32] = "World";
printf("mystrcpy = %s\n", mystrcpy(dest, src)); printf("mystrcat = %s\n", mystrcat(dest, src)); printf("mystrcmp = %d\n", mystrcmp(dest, src)); printf("mystrlen = %ld\n", mystrlen(dest));
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { char *p = "root:x:0:0:root:/root:/bin/bash"; int i = 0;
for(i = 0; p[i] != '\0'; i++) { if(p[i] != ':') printf("%c", p[i]); else printf("\n"); }
return 0; }
|