Skip to content

Commit 979f191

Browse files
📝 更新C语言文档,优化数组章节内容
- 在数组章节中增加了对数组定义、初始化和访问的详细说明,提升了对数组使用的理解。 - 删除了冗余的内容,简化了文档结构,增强了可读性。 - 新增了数组的内存存储细节和注意事项,帮助读者更好地理解数组的特性。
1 parent b1e75f6 commit 979f191

File tree

6 files changed

+310
-1007
lines changed

6 files changed

+310
-1007
lines changed

docs/docs/选择编程语言/C/0基础语法.mdx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ title: 基础语法
1212
### 函数定义格式
1313

1414
- 主函数定义的格式:
15-
- int 代表函数执行之后会返回一个整数类型的值
16-
- main 代表这个函数的名字叫做 main
17-
- () 代表这是一个函数
18-
- {} 代表这个程序段的范围
19-
- return 0; 代表函数执行完之后返回整数 0
15+
- `int` 代表函数执行之后会返回一个整数类型的值
16+
- `main` 代表这个函数的名字叫做 main
17+
- `()` 代表这是一个函数
18+
- `{}` 代表这个程序段的范围
19+
- `return 0;` 代表函数执行完之后返回整数 0
2020

2121
```c showLineNumbers
2222
int main() {
@@ -31,11 +31,11 @@ int main() {
3131
:::
3232

3333
- 其它函数定义的格式
34-
- int 代表函数执行之后会返回一个整数类型的值
35-
- call 代表这个函数的名字叫做 call
36-
- () 代表这是一个函数
37-
- {} 代表这个程序段的范围
38-
- return 0; 代表函数执行完之后返回整数 0
34+
- `int` 代表函数执行之后会返回一个整数类型的值
35+
- `call` 代表这个函数的名字叫做 call
36+
- `()`代表这是一个函数
37+
- `{}` 代表这个程序段的范围
38+
- `return 0;` 代表函数执行完之后返回整数 0
3939

4040
```c showLineNumbers
4141
int call() {

docs/docs/选择编程语言/C/1变量.mdx

Lines changed: 80 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -240,65 +240,91 @@ int main(){
240240

241241
类型字符串用以表示输出数据的类型, 其格式符和意义如下所示
242242

243-
| 类型 | 含义 |
244-
| ----- | ----------------------------------- |
245-
| c | 字符 |
246-
| f | 单、双精度浮点数(默认保留 6 位小数) |
247-
| d / i | 有符号 10 进制整型 |
248-
| u | 无符号 10 进制整型 |
249-
| o | 无符号 8 进制整型 |
250-
| x / X | 无符号 16 进制整型 |
251-
| e / E | 以指数形式输出单、双精度浮点数 |
252-
| g / G | 以最短输出宽度,输出单、双精度浮点数 |
253-
| s | 字符串 |
254-
| p | 地址 |
255-
| n | 不输出字符,将已输出字符数存储到指针指向的变量中 |
256-
| % | 输出一个百分号字符 % |
243+
| 类型 | 含义 | 示例 |
244+
| ----- | ----------------------------------- | ---- |
245+
| **字符类型** |
246+
| c | 单个字符 | `%c` |
247+
| s | 字符串(char 数组) | `%s` |
248+
| **整数类型** |
249+
| d / i | 有符号 10 进制整数 | `%d`, `%i` |
250+
| hd / hi | short int(短整型) | `%hd`, `%hi` |
251+
| ld / li | long int(长整型) | `%ld`, `%li` |
252+
| lld / lli | **long long int(长长整型)** | `%lld`, `%lli` |
253+
| u | 无符号 10 进制整数 | `%u` |
254+
| hu | unsigned short int | `%hu` |
255+
| lu | unsigned long int | `%lu` |
256+
| llu | **unsigned long long int** | `%llu` |
257+
| **其他进制整数** |
258+
| o | 无符号 8 进制整数 | `%o` |
259+
| lo | unsigned long int(8进制) | `%lo` |
260+
| llo | **unsigned long long int(8进制)** | `%llo` |
261+
| x / X | 无符号 16 进制整数 | `%x`, `%X` |
262+
| lx / lX | unsigned long int(16进制) | `%lx`, `%lX` |
263+
| llx / llX | **unsigned long long int(16进制)** | `%llx`, `%llX` |
264+
| **浮点数类型** |
265+
| f | float/double(默认保留 6 位小数) | `%f` |
266+
| lf | double(推荐用法) | `%lf` |
267+
| e / E | 科学计数法输出浮点数 | `%e`, `%E` |
268+
| g / G | 自动选择最短格式输出浮点数 | `%g`, `%G` |
269+
| **特殊类型** |
270+
| p | 指针地址 | `%p` |
271+
| n | 不输出字符,存储已输出字符数 | `%n` |
272+
| % | 输出百分号字符 % | `%%` |
257273

258274

259275
```c showLineNumbers
260276
#include <stdio.h>
261277
int main(){
262-
int a = 10;
263-
int b = -10;
264-
float c = 6.6f;
265-
double d = 3.1415926;
266-
double e = 10.10;
267-
char f = 'a';
268-
// 有符号整数(可以输出负数)
269-
printf("a = %d\n", a); // 10
270-
printf("a = %i\n", a); // 10
271-
272-
// 无符号整数(不可以输出负数)
273-
printf("a = %u\n", a); // 10
274-
printf("b = %u\n", b); // 429496786
275-
276-
// 无符号八进制整数(不可以输出负数)
277-
printf("a = %o\n", a); // 12
278-
printf("b = %o\n", b); // 37777777766
279-
280-
// 无符号十六进制整数(不可以输出负数)
281-
printf("a = %x\n", a); // a
282-
printf("b = %x\n", b); // fffffff6
283-
284-
// 无符号十六进制整数(不可以输出负数)
285-
printf("a = %X\n", a); // A
286-
printf("b = %X\n", b); // FFFFFFF6
287-
288-
// 单、双精度浮点数(默认保留6位小数)
289-
printf("c = %f\n", c); // 6.600000
290-
printf("d = %lf\n", d); // 3.141593
291-
292-
// 以指数形式输出单、双精度浮点数
293-
printf("e = %e\n", e); // 1.010000e+001
294-
printf("e = %E\n", e); // 1.010000E+001
295-
296-
// 以最短输出宽度,输出单、双精度浮点数
297-
printf("e = %g\n", e); // 10.1
298-
printf("e = %G\n", e); // 10.1
299-
300-
// 输出字符
301-
printf("f = %c\n", f); // a
278+
// 字符和字符串
279+
char ch = 'A';
280+
char str[] = "Hello";
281+
printf("字符: %c\n", ch); // A
282+
printf("字符串: %s\n", str); // Hello
283+
284+
// 各种整数类型
285+
short short_num = 12345;
286+
int int_num = 123456;
287+
long long_num = 1234567890L;
288+
long long longlong_num = 1234567890123456789LL;
289+
290+
printf("short: %hd\n", short_num); // 12345
291+
printf("int: %d\n", int_num); // 123456
292+
printf("long: %ld\n", long_num); // 1234567890
293+
printf("long long: %lld\n", longlong_num); // 1234567890123456789
294+
295+
// 无符号整数
296+
unsigned int uint_num = 4294967295U;
297+
unsigned long long ulonglong_num = 18446744073709551615ULL;
298+
299+
printf("unsigned int: %u\n", uint_num); // 4294967295
300+
printf("unsigned long long: %llu\n", ulonglong_num); // 18446744073709551615
301+
302+
// 不同进制输出
303+
int num = 255;
304+
printf("十进制: %d\n", num); // 255
305+
printf("八进制: %o\n", num); // 377
306+
printf("十六进制: %x\n", num); // ff
307+
printf("十六进制(大写): %X\n", num); // FF
308+
309+
// long long 的不同进制
310+
long long big_num = 255LL;
311+
printf("long long 八进制: %llo\n", big_num); // 377
312+
printf("long long 十六进制: %llx\n", big_num); // ff
313+
314+
// 浮点数
315+
float f_num = 3.14159f;
316+
double d_num = 3.141592653589793;
317+
318+
printf("float: %f\n", f_num); // 3.141590
319+
printf("double: %lf\n", d_num); // 3.141593
320+
printf("科学计数法: %e\n", d_num); // 3.141593e+00
321+
printf("自动格式: %g\n", d_num); // 3.14159
322+
323+
// 指针地址
324+
int *ptr = &int_num;
325+
printf("指针地址: %p\n", ptr); // 类似 0x7fff5fbff6ac
326+
327+
return 0;
302328
}
303329
```
304330

docs/docs/选择编程语言/C/2数据.mdx

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,177 @@ int main(){
390390
printf("d = %lf\n", d); // 3.140000
391391
}
392392
```
393+
394+
## 数组
395+
396+
在 C 语言中,数组属于**构造数据类型**,是一组`相同类型`数据的`连续内存`集合。
397+
398+
数组的特点包括:
399+
400+
- 固定大小(编译时确定)
401+
- 元素类型相同
402+
- 内存连续分配
403+
- 通过下标访问(从0开始)
404+
405+
406+
定义数组:`数据类型 数组名[数组长度];`
407+
408+
```c showLineNumbers
409+
// int 元素类型
410+
// ages 数组名称
411+
// [10] 数组长度 即 元素个数
412+
int ages[10];
413+
// 数组名为ages, 数组类型为int [10]
414+
415+
int scores[5]; // 5个整数的数组
416+
double temps[30]; // 30个双精度浮点数
417+
char name[20]; // 20个字符的字符数组,也叫字符串
418+
```
419+
420+
421+
### 初始化数组
422+
423+
```c showLineNumbers
424+
// 完全初始化, 其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔
425+
// 定义的同时可以初始化多个值
426+
int ages[3] = {4, 6, 9};
427+
428+
// 完全初始化,不指定元素个数,自动计算长度
429+
int days[] = {31,28,31,30,31}; // 自动确定为5个元素
430+
431+
// 部分初始化(剩余自动补0)
432+
int arr[5] = {1, 2}; // [1, 2, 0, 0, 0]
433+
434+
// 部分初始化,指定位置的元素初始化
435+
int nums[5] = {[0] = 1,[1] = 2}; // [1, 2, 0, 0, 0]
436+
437+
438+
// 先定义后初始化
439+
int nums[3];
440+
441+
nums[0] = 1;
442+
nums[1] = 2;
443+
nums[2] = 3;
444+
445+
int ages[3]; // 定义后只能逐个初始化值
446+
ages = {4, 6, 9}; // 报错
447+
```
448+
449+
如果定义数组后,<Highlight>没有初始化,数组中是随机的垃圾数</Highlight>,所以如果想要正确使用数组应该要进行初始化。
450+
451+
452+
:::info
453+
454+
在定义数组的时候[]里面能写整型常量或者是返回整型常量的表达式
455+
456+
不能写变量。
457+
458+
```c showLineNumbers
459+
#include <stdio.h>
460+
461+
int main() {
462+
int ages1['A'] = {19, 22, 33};// 'A' 会被转换为 65
463+
printf("ages1[0] = %d\n", ages1[0]);
464+
465+
int ages2[5 + 5] = {19, 22, 33};
466+
printf("ages2[0] = %d\n", ages2[0]);
467+
468+
int ages3['A' + 5] = {19, 22, 33};// 'A' + 5会被转换为 70
469+
printf("ages3[0] = %d\n", ages3[0]);
470+
471+
printf("sizeof(ages3) = %lu\n", sizeof(ages3));// 大小为 70 * 4 = 280
472+
}
473+
474+
```
475+
:::
476+
477+
### 数组元素的访问
478+
479+
使用数组时不能超出数组的索引范围使用, 索引从 0 开始, 到元素个数-1 结束
480+
481+
通过下标(索引)访问:
482+
483+
```c showLineNumbers
484+
int nums[3] = {10, 20, 30};
485+
nums[0] = 15; // 修改第一个元素
486+
int x = nums[2]; // 读取第三个元素
487+
488+
// 越界访问
489+
int arr[3];
490+
arr[5] = 10; // 未定义行为!可能破坏其他内存,导致程序崩溃
491+
```
492+
493+
### 数组的遍历
494+
495+
遍历的意思就是有序地查看数组的每一个元素
496+
497+
```c showLineNumbers
498+
#include <stdio.h>
499+
int main() {
500+
501+
int ages[4] = {11, 22, 33, 44};
502+
503+
// 正序输出(遍历)数组
504+
for (int i = 0; i < 4; i++) {
505+
printf("ages[%d] = %d\n", i, ages[i]);
506+
}
507+
508+
// 逆序输出(遍历)数组
509+
for (int i = 3; i >=0; i--) {
510+
printf("ages[%d] = %d\n", i, ages[i]);
511+
}
512+
513+
return 0;
514+
}
515+
```
516+
517+
518+
### 数组的内存
519+
520+
因为数组在内存中占用的字节数取决于其存储的数据类型和数据的个数
521+
522+
数组所占用存储空间 = 一个元素所占用存储空间 x 元素个数(数组长度)
523+
524+
可以使用`sizeof`函数来计算数组所占用的存储总空间和元素所占用的空间,进一步可以计算出数组的长度
525+
526+
```c showLineNumbers
527+
#include <stdio.h>
528+
int main() {
529+
int ages[4] = {19, 22, 33};
530+
int length = sizeof(ages) / sizeof(ages[0]);
531+
printf("length = %d\n", length);
532+
return 0;
533+
}
534+
535+
```
536+
537+
- 内存寻址从大到小, 从高地址开辟一块连续没有被使用的内存给数组
538+
- 从分配的连续存储空间中, 地址小的位置开始给每个元素分配空间
539+
- 从每个元素分配的存储空间中, 地址最大的位置开始存储数据
540+
- 用数组名指向整个存储空间最小的地址
541+
542+
543+
```c showLineNumbers
544+
#include <stdio.h>
545+
int main()
546+
{
547+
int num = 9;
548+
char cs[] = {'l','n','j'};
549+
printf("cs = %p\n", &cs); // cs = 0060FEA9
550+
printf("cs[0] = %p\n", &cs[0]); // cs[0] = 0060FEA9
551+
printf("cs[1] = %p\n", &cs[1]); // cs[1] = 0060FEAA
552+
printf("cs[2] = %p\n", &cs[2]); // cs[2] = 0060FEAB
553+
554+
int nums[] = {2, 6};
555+
printf("nums = %p\n", &nums); // nums = 0060FEA0
556+
printf("nums[0] = %p\n", &nums[0]);// nums[0] = 0060FEA0
557+
printf("nums[1] = %p\n", &nums[1]);// nums[1] = 0060FEA4
558+
559+
return 0;
560+
}
561+
```
562+
563+
![](https://images.weserv.nl/?url=https://img-blog.csdnimg.cn/img_convert/e0aa63f597f92632c90cd1c5f6adc292.png)
564+
565+
> - 注意:字符在内存中是以对应 ASCII 码值的二进制形式存储的,而非上述的形式。
566+

0 commit comments

Comments
 (0)