C语言入门保姆教学~

发布时间 2023-10-18 15:21:55作者: 空手只套小鱼干

(本文推荐的是本人初识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.常量和指针

......