1 -------------------------------------
2 day05
3
4 -------------------------------------
5 回顾:
6 1》控制流
7 分支结构:
8 if else if else
9 switch case --- break
10 goto
11 2》函数:
12 返回值 函数名字(函数参数)
13 {
14 函数体
15 }
16
17 void fun(void)
18 {
19 xxxx;
20 }
21
22 int main(void)
23 {
24 fun(); --函数调用
25 }
26
27 3》指针:
28 *》取地址 &
29 char xx = 'a';
30 &xx; ---- char *
31 char *yy = &xx;
32 printf("%p\n",yy);
33
34 *》解引用:*
35 *yy ----> xx
36
37 4》数组:
38 同一类型数据紧挨保存在一块空间
39 short arr[33];
40
41 -----------------------------------------
42 如何修改 vi 界面:
43 vim ~/.vimrc
44 set cursorline
45 set nu
46 set mouse=a
47 set tabstop=4
48 set softtabstop=4
49 set shiftwidth=4
50 set cindent
51 set ruler
52
53
54 如何快速整理格式:
55 在命令模式下
56 gg=G
57
58 --------------------------------------------
59 字符数组:-----就是 字符串
60 *》概念:
61 数组里面的保存的都是字符
62
63 *》姿势:
64 char 数组名字[数组大小];
65 例子:
66 char arr[50];
67
68 *》定义,赋值 都类似数组..
69 *》初始化:
70 *>不完全初始化
71 char arr[20]={'A'}; 下标为0的位置保存'A',其他全部为0
72 char arr[20]={0};
73 还可以: char arr[20]={'\0'};
74 char arr[20]="fewf";
75 "fewf" ---> 有5个字符 'f' 'e' 'w' 'f' '\0'
76
77 *>完全初始化
78 char arr[10]="123456789";
79 char arr[10]="0123456789";----理论上这是错误的
80
81 *》字符串函数的使用:
82 *》bzero ---- 清空
83 #include <strings.h>
84 void bzero(void *s, size_t n);
85 解释:
86 bzero()函数将从s开始的区域的前n个字节设置为零
87 分析:
88 s: 万能指针类型变量,你需要清0的对象
89 n: 需要清0的字节数
90 返回值: 没有返回值
91
92 例子:
93 int a = 0x0f3e5523;
94 bzero(&a,2); --->??? 0x0f3e0000
95
96 以后经常使用:
97 char buf[50]; ----> 垃圾值 char *
98 bzero(buf,sizeof(buf));
99
100
101 void : 没有类型的类型,包含了所有类型,然后又不能用任何类型
102 void * ---> 万能指针
103 void *xx; --- 万能指针类型的变量 xx;
104 short *ss = (short *)xx;
105 int *ii = (int *)xx;
106
107 void *yy = ii; --->自动转换
108
109 size_t : 取别名操作 unsigned int
110 typedef unsigned int size_t;
111
112 *》memset:
113 #include <string.h>
114 void *memset(void *s, int c, size_t n);
115 解释:
116 memset()函数将s所指向的内存区域的前n个字节填入c
117 分析:
118 s: 万能指针类型变量,你需要操作的对象
119 c: 填充物
120 n: 需要操作的字节数
121 返回值: void * --- 万能指针类型
122 返回的就是s
123 例子:
124 char arr[20]={0};
125 memset(arr,'a',10);
126 printf("%s\n",arr);------> aaaaaaaaaa
127 解说: printf用 %s来打印字符串,碰到'\0'才会结束
128 abcdefd --》 将c换成'\0' 就只能打印ab
129
130 *》strcpy
131 #include <string.h>
132 char *strcpy(char *dest, const char *src);
133 解释:
134 将src(包括'\0')拷贝到dest中---- 覆盖dest--从第一个字节开始
135 dest空间要比src空间大
136 分析:
137 src : 原数组(数据)
138 dest: 目标数组(数据)
139 返回值: char * ---- 字符指针类型
140 返回dest
141
142 例子:
143 char dest[20]="ILOVEU";
144 char src[10]="OK";
145 strcpy(dest,src);
146
147 char arr[20]; ---》 arr是什么东西???
148 解说: arr 是数组的首地址,也是第一个元素的地址
149 arr的值不允许发生改变
150 结果: arr 是 char * 类型
151
152
153
154
155 char name[20]="Tonly";
156 if(name=="Tonly")------没有这种写法,该写法错误
157 *strcmp
158 #include <string.h>
159 int strcmp(const char *s1, const char *s2);
160 解释:
161 strcmp()函数对两个字符串s1和s2进行比较。 它返回 一个小于、等于或大于0的整数
162 本质:
163 *》选取s1的第一个字符 和 s2的第一字符进行对比,
164 如果 s1的第一个字符 比 s2的第一字符小 就返回一个负数
165 如果 s1的第一个字符 比 s2的第一字符大 就返回一个正数
166 如果 s1的第一个字符 比 s2的第一字符相等,则比较第二个字符
167 如果s1和s2相等,则返回0
168 分析:
169 s1 s2 需要比较的字符串
170 返回值:
171 s1 < s2 返回负数
172 s1 > s2 返回正数
173 s1 等于 s2 返回0
174
175 例子:
176 char s1[20]="ILOVEU";
177 char s2[20]="ILOVEU";
178 strcmp(s1,s2);
179
180
181 *strlen
182 #include <string.h>
183 size_t strlen(const char *s);
184 解释:
185 strlen计算s的长度(不包含'\0')
186 该计算 碰到 '\0'就结束
187 分析:
188 s: 字符串
189 返回值:
190 size_t : unsigned int 字符串的长度
191
192 ---------------------------------
193 const:
194 *》不变的,修饰谁,谁就是不能改变的值
195 例子:
196 const int a = 10;
197 a = 20; -------出错
198
199 *》
200 int b = 20;
201 int a = 10;
202 const int *p = &a;----> const 修饰的是 *p
203 所有 *p 不允许发生改变
204
205 p = &b; ---没问题
206 *p = 30; ---出错
207 a = 30; ---没问题
208
209 *》
210 int b = 20;
211 int a = 10;
212 int * const p = &a; ---》 const 修饰的是p
213 p不允许发生改变
214
215 p = &b; --- 错误
216 *p = 30; ---没问题
217
218 *>
219 int a = 10;
220 const int * const p = &a;
221 *p 和 p 都不允许发生改变
222
223
224 int a = 10;
225 const int *p= &a; const 修饰的*p不允许改变 -- 不允许通过*p方式去改变值
226 const 修饰*p --》阻止解引用改变值的操作
227 *p = 30; --- 出错。
228 int *pp = p;
229 *pp = 30; ---没有问题
230
231 ----------------------------------------------------------
232 可变数组:
233 1》概念:
234 数组在定义前,大小可变
235
236 2》姿势:
237 类型 数组名[N]; N代表一个变量
238 int a = 100;
239 int arr[a];-----可变数组
240
241 ****可变数组一旦定义好之后就永远不能发生改变
242
243 3》注意事项:
244 可变数组不允许发生 初始化 操作,只能定义并通过下标的方式赋值
245 int a = 20;
246 int arr[a]={1,2,3,4,5};-----这是错误的
247
248 4》好处:
249 在程序运行的时候来决定数组的大小
250
251 ------------------------------------------------
252 二维数组:
253 1》概念:
254 一个一维数组的 元素 是 一维数组就形成了二维数组
255
256 2》姿势:
257 类型 数组名字[一维数组的个数][每一个一维数组中元素个数];
258 例子:
259 int arr[2][3];
260 ----- 该数字由 2个 一维数组组成,每一个一维数组中有3个int类型数据
261 顾:组成该二维数组的基本元素个数有6个int类型
262
263 3》赋值:
264 int arr[2][3];
265 arr[0][0]=10;
266 arr[1][1]=20;
267
268 4》初始化:
269 *》完全初始化:
270 int arr[2][3]={1,2,3,4,5,6};
271 int arr[2][3]={{1,2,3},{4,5,6}};
272
273 *》不完全初始化:
274 int arr[2][3]={0};
275 int arr[2][3]={[0][1]=10,[1][1]=20};
276
277 5》使用:
278 int arr[3][4]={
279 {1,2,3,4},
280 {5,6,7,8},
281 {9,8,7,6}
282 };
283
284 练习:
285 打印: 5*5 的二维数组的对角线的值
286 int arr[5][5]={
287 {1,2,3,4,5},
288 {},
289 {},
290 {},
291 {}
292
293 };
294
295 ---------------------------------------------------------
296 多维数组:
297 *》姿势:
298 int arr[2][3][4][5][6][7];
299 分析:
300 这是一个 6维数组
301 该数组由 2个 5维数组组成
302 每一个5维数组有 3个 四维数组组成
303 每一个4维数组 由 4个 三维数组组成
304 每一个三维数组 由 5个 二位数组组成
305 每一个二维数组由 6个 一维数组组成
306 每一个一维数组 由 7个 int 类型组成
307
308 打印出每一个值:
309 int i,i,k,x,y,z;
310 for(i=0;i<2;i++)
311 {
312 for(j=0;j<3;j++)
313 {
314 for(x=0;x<4;x++)
315 {
316 for(y=0;y<5;y++)
317 {
318 for(z=0;z<6;z++)
319 {
320 for(k=0;k<7;k++)
321 {
322 printf("%d",arr[i][j][x][y][z][k]);
323 }
324 }
325 }
326 }
327 }
328
329 }
330
331 -----------------------------------------