C语言入门保姆教学~
(本文推荐的是本人初识C语言入门学习的途径,内容包含视频+笔记+思维导图总结。重新翻看了下笔记写得较为潦草,需配合视频+论坛翻阅,还是以视频+思维导图为主。如有错漏之处,敬请指正)
零基础入门C语言教程,视频导航,根据视频资源编写自己见解的学习笔记,再从笔记中提炼总结的思维导图,一步到位 🫠。
视频
推荐B站小甲鱼老师C语言教学,适合零基础学员入门,内容生动有趣,能针对重点知识点进行详细讲解。小甲鱼老师非常活泼开朗一定能给到初学者良好的编程初体验。每章都有课后作业,存放于鱼C论坛中,配合视频食用效果更佳,不写也无伤大雅。
思维导图总结
根据视频、笔记及多种渠道汇聚成的总结思维导图,不敢说一定全都有,但可以说应有尽有😏。内容太多了太大了,放不上,硬上也影响体验看不清😂。有需要的宝,点赞+私我,免费派送。
学习随笔
看视频,逛论坛的随笔,内容包括视频讲解的重点,难点,课后作业的解答与自己的理解,想到啥记啥,内容相当炸裂13K字,不过记录得比较潦草,空口下饭寡淡无味,还是需要宝们自己辩证观看。内容太多,我上传需要修修补补,会慢慢更新。一样,比较需要的点赞+V我。
17~18.数组
数组初始化的种种方式:
A. 将数组中所有元素统一初始化为某个值,可以这么写:
int a[10] = {0}; // 将数组中所有元素初始化为 0
B. 如果是赋予不同的值,那么用逗号分隔开即可:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
C. 还可以只给一部分元素赋值,未被赋值的元素自动初始化为 0:
// 表示为前边 6 个元素赋值,后边 4 个元素系统自动初始化为 0
int a[10] = {1, 2, 3, 4, 5, 6};
D. 有时候还可以偷懒,可以只给出各个元素的值,而不指定数组的长度(因为编译器会根据值的个数自动判断数组的长度):
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
E. C99 增加了一种新特性——指定初始化的元素。这样就可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为 0:
// 编译的时候记得加上 –std=c99 选项
int a[10] = {[3] = 3, [5] = 5, [8] = [8]};
变长数组(VLA):
C99 标准新增变长数组(VLA,variable length array)的概念,这里的变长指的是数组的长度是在运行时才能决定,但一旦决定在数组的生命周期内就不会再变。(虽然可用malloc函数实现类似功能,但是VLA存储的区域为动态栈里)
printf("请输入字符的个数:");
scanf("%d", &n);
char a[n+1];
多维数组的地址计算:
以三维数组为基础,往后递推。
有数组A[m][n][p],计算A[i][j][k]的地址。
行优先:先把右边的填满。
偏移量为inp+j*p+k
列优先:先把左边的填满。
偏移量为knm+j*m+i
提醒:array[3][4]+5与array[3][4][5]不一样。
19.字符串处理函数
sizeof, sizelen
包含'\0' 不包含'\0'
strcpy strncpy
拷贝字符串,不会自动追加'\0'
strcat strncat
拼接字符串,会自动追加'\0'
strcmp strncmp
比较字符串
20.二维数组
二维数组的存储,套娃模式启动
21.指针
32位系统,指针地址都是4个字节
64位系统,指针地址都是8个字节
避免访问未初始化的指针(野指针):
int *p; //(错误)
int a;int *p=&a; //(正确)//int* p = NULL;
23.指针数组和数组指针
指针数组(数组里存放指针)
//从符号优先级看
int *p1[5]={“1”,“2”,“3”,“4”,“5”};
数组指针(指针指向数组)
char *array[5] = {"FishC", "Five", "Star", "Good", "WoW"};
char *(*p)[5] = &array;
for (i = 0; i < 5; i++)
{
for (j = 0; (*p)[i][j] != '\0'; j++)
{
printf("%c ", (*p)[i][j]);
}
printf("\n");
}
//两者相同
Str[3] == *(str+3);
array 是数组第一个元素的地址,所以 array + 1 指向数组第二个元素;&array 是整个数组的地址,所以 &array + 1 指向整个数组最后的位置。
int array[10] = {0};
24.指针和二维数组
int array[2][3] = {{0, 1, 2}, {3, 4, 5}};
int (*p)[3] = array;
printf("**(p+1): %d\n", **(p+1)); //3
printf("**(array+1): %d\n", **(array+1)); //3
printf("array[1][0]: %d\n", array[1][0]); //3
printf("*(*(p+1)+2): %d\n", *(*(p+1)+2)); //5
printf("*(*(array+1)+2): %d\n", *(*(array+1)+2)); //5
printf("array[1][2]: %d\n", array[1][2]); //5
//一个[ ]对应* //先解析括号**(p+1)
25.void指针和NULL指针
不要对void指针进行解引用。
字符串的特殊约定(%s,str);
//指针不清楚指向哪就指向地址0(NULL)
char *ch = NULL
大端序和小端序:
大端序:低位数据放内存地址高位,高位数据放内存地址低位。
小端序:低位数据放内存地址低位,高位数据放内存地址高位。
sizeof(void *) ;
//因为指针的尺寸是与编译器的目标平台相关的。比如目标平台是 32 位的,那么 sizeof(void*) 就是 4,如果是 64 位的,那么 sizeof(void *) 就是 8,如果是 16 位的,那么就是2。
26.指向指针的指针
//指针数组与指向指针的指针
int *p[5]={0};
int **pl=p;
char a[3][4]={0};
char (*p)[4]=a;
//数组指针与二维数组(系统跨度一样(一维指针不能☞二维数组))//本质上数组名代表地址
"*" and "&"是一对。
27.常量和指针
......