C语言学习笔记-1

Matrix Xu Lv1

博主马上大一了,看着必修的里面肯定有C语言,加上自己家里有一些书,自己决定写个小小的机器学习项目来学一学C语言。
仓库:简陋的机器学习
说是学习笔记,其实应该更像是吐槽大会一样

写在前面(叠甲)

刷到这个小众个人网站的人肯定要么认识我,要么在线上认识我,不排除以后我出名了有人来考古,在这里先叠个甲。

在写这篇文章的时候,本人是个纯正的菜鸡,看到也不要喷我

好的叠甲完毕,开始正文

程序部分

函数

函数其实很简单,可以用下面这些来定义一个函数

1
2
3
4
5
6
int new_function()
{
// Write something here
return 0 ;
}

最多能用到的,估计就是一个可以输入参数的函数,他长这样

1
2
3
4
5
6
7
8
int new_function( int *matrix , int x , int y )
{
printf("matrix1 is : %d \n
x is : %d \n
y is : %d \n" , matrix[1] , x , y );
return 0 ;
}

这就是一个可以输入参数的函数。有一个需要注意的点就是,如果输入的是一个数组且你需要导入的数组长和宽都不定,那么你需要先把整个数组一维化,然后再进行后续的操作

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
int new_function( int *matrix , int x , int y) 
//这里无论你输入的是多少维的数组,都会被SB的C标准报错要求输入一维数组
//二维也不是不行,但是只能有一个维度有变量
{
int m = 0; //初始化数据,m是组内第几个数,n是第几组
int n = 0; //如果不加等于零的初始化,可能会把原本内存里的数据沿用过来,导致程序错误
scanf("%d %d" , &n , &m );
if(( n > x && m > y )){ //添加不合法判断
printf("ERROR: Wrong input!");
} else{
//这里是数组转换的部分,我们需要知道原来数组里的东西对应到被SB转换成的一维数组中的哪个地方
//转换规则很简单:把第一个组的尾部和第二个组的头部接起来,以此类推
//这个地方说的不太严谨,参考下面的数组章节
int num = matrix[ (n - 1) * y + m - 1];
printf("%d" , num );
}
return 0;
}

int main(){
int matrix[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
} ;
new_function( (int *)matrix , 3 , 4); //这里的(int *)是在进行数组的强行转换
return 0;
}

数组

然后来到了数组,先上图

数组示意图

数组,顾名思义,就是把数绑成一组,这里先介绍一维数组和二维数组,分别如上图所示。
具体有什么用请自行探索,这里只说明几个关键的地方

数组的定义模式

数组的定义模式和高中的坐标系不同,数组可以理解为“有几个组?”和“组里有几个元素?”这两个问题,例如上面的部分代码:

1
2
3
4
5
int matrix[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
}

这是一个有三组,每组有四个元素的数组,而不是横向有三列纵向有四行的表,这个和坐标系有所区别

数组的转换

数组在被传入函数的时候必须变成指针,也就是你只能输入一个数组在内存里的起始位置,想要获取数组中的信息,就需要你自己拼凑出完整的地址,从而获取到数组内的元素,如下图:

数组示意图

我相信这张图可以直观地让你感受到电脑是怎么在操作你的数据的,也得归功于电脑的SB设计源自于电脑内存的地址设计,我们只能这样通过换算地址的方式去完成数据的存取,比如这样:

数组示意图

关于你能不能读取更远或者后面的数据,请详见操作系统相关内容。

返回值

返回值是个很有用的东西,他可以负责函数内部和外部的结果传递,返回值不一定是一个数字,也可以是数组,字符串或者其他东西。

比如我们做了一个比较两者大小的小程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int max( int x , int y ) 
{
if ( x > y ){
return x;
} else if ( x < y ){
return y;
} else {
return x;
}
}

int main(){
int num = max(5,6); //这个地方你可以理解成执行完函数以后return的值被放到了这里
printf("%d",num);
return 0;
}

工具部分

本人使用的是VScode搭配GCC(minGW64)所以断点和调试器基本不用做配置,gcc给出来的原生报错已经很完善了,所以不怎么需要调整,考虑到以后可能使用Linux,准备学一学Vim作为备用

这里介绍几个比较好用的工具吧

报错

报错是重要的程序错误的获得来源之一,根据报错我们可以获得很多信息,举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//try.cpp
#include <stdio.h>

int max( int x , int y )
{
if ( x > y ){
return x;
} else if ( x < y ){
return y;
} else {
return x;
}
}

int main(){
int num = max(5,6);
printf("%d",num)
return 0;
}

上面是一段错误的程序,找找错误在哪里

小小的解答

当你尝试编译的时候,就会出现下面的部分

1
2
3
4
5
6
7
8
PS E:\AchieveBox> gcc try.cpp -o try.exe
try.cpp: In function 'int main()':
try.cpp:16:21: error: expected ';' before 'return'
16 | printf("%d",num)
| ^
| ;
17 | return 0;
| ~~~~~~

这里编译器就会告诉你,在第十六行的最末尾的地方有一个缺失的部分,但是有部分编译器会选择把这种错误报到第十七行,所以有时候某一行报错并不意味着某一行有问题,有可能它的上下出现了一些问题。

调试模式

由于本人使用的是minGW的编译器,所以顺带就使用GDB作为调试

调试模式允许你通过添加断点的方式把程序停下来,然后逐步执行,这样就可以逐步排查程序里面哪些东西出了问题

例如下面这个错误:

1
2
3
4
5
6
7
8
9
//try.cpp
#include <stdio.h>

int main(){
int a = 3 ;
int b = 6.2 ;
printf("%d",a+b);
return 0;
}

你先手动算一下,然后再复制到编译器里编译一下,你就会发现有问题

小小的解答

这个地方涉及到了C语言中int类型的范围,int,也就是整型,只能支持储存整数,他会把数直接从整数部分截断,然后储存进固定的内存地址

遇到这种问题,一是考验你对于C语言的各种标准熟不熟悉,第二可以通过调试发现问题,请看下面两张调试图:

调试截图

调试截图

被高亮的一行是马上就要开始执行的一行,从第一张图就可以看出,a的初始化是正确的,但是b的初始化出现了明显的问题,6.2被储存成了6,导致最后的结果和预想的不同。

对于这个问题,可以采用更改变量类型的方式,允许小数部分参与运算:

1
2
3
4
5
6
7
8
9
//try.cpp correct ver
#include <stdio.h>

int main(){
int a = 3 ;
double b = 6.2 ;
printf("%g",a+b);
return 0;
}

尾章

这不是教程,也不是课件,只是一个人小小的笔记,希望能够帮到一些人

  • Title: C语言学习笔记-1
  • Author: Matrix Xu
  • Created at : 2026-07-21 15:59:41
  • Updated at : 2026-07-22 18:42:01
  • Link: https://www.matrix060.top/2026/07/21/C语言学习笔记-1/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments