C语言学习记录-12/21

学习内容:

昨日所学小记:

1.数组名

对于一个数组 int arry[5]={0};,作为实际参数来说:
1)arry[0]相当于一个变量名
2)&arry[0]相当于第一个元素的地址
3)arry本身相当于第一个元素的地址(可认为是指针,记录数组起始位置地址,相当于"int* arry"')(个人感觉这里是编译器的智能化,直接将数组名看作指向首元素地址的指针)
4)对于sizeof(arry)和&arry相当于取整个数组的地址,整个数组的地址的值的大小等于第一个元素的地址的值的大小,但是所约束的意义不同。当“arry+1”时,加的是一个元素的地址(这里int类型,加4个字节),当“&arry+1”时加的是整个数组总和的地址(这里int类型,5个元素,加20个字节)。

2.数组传参

例子: add(arry)------->void add(int arry[])

疑惑:刚看到这个传参的时候,我感到很疑惑:arry是首元素的地址,你将地址传给了"int arry[]“,为什么"int arry[]"可以接收地址,它是指针吗?指针的写法不该类似"int* p"或者"int* arry"吗?(这里我傻傻的数个数去给指针变量加减,其实不需要这样麻烦)

解答:在C语言中数组作为形参有两种表示方式(形式上的差别):
1)就是写作数组“void add(int arry[])”,在这里数组arry[]就相当于指针中括号的意思就是表明这是个该当作数组的看待的形参,因为传过来的首元素的地址,所以这里数组形参的大小没有意义,不管你在中括号里写什么,这个数组形参都还是指向首元素的地址。(这里就是编译器的智能化,既然知道了数组的首地址,还知道它应该是个数组,就可以在被调用的函数里用类似"arry[0]”,"arry[2]“这样的写法去操作。)(对于二维数组,形参写作"int arry[][4]”,因为二维数组内存存放是连续的,所以要明确列数去划分各行内容。它知道你的首元素的地址,又知道该把你看成个二维数组,在后面就可以用“arry[1][2]"这种操作,简单明了。)
2) 写作指针:”void add(int* arry)“。(个人感觉两种表示方法的区别:arry–>&arry[0];//本身是首元素地址,arry+1–>&arry[1];//加一是数组第二位地址,以此类推。相比数组表示方法的,arry[0]=xxxx; arry[1]=xxxxx;,显得麻烦的多,你需要去数个数,去想我应该加几。)

3.下棋小游戏

1)写作习惯的养成(重要,学到了新东西,我一开始就是一个.c写全部,看的确实乱,不清晰),一个项目基本分块:
 a.头文件(.h):声明函数,对符号进行定义,对包含的头文件声明。(所有项目内.c都可以访问.h头文件的东西。)
 b.逻辑文件(.c):理清项目实现逻辑,类似于流程图
 c.定义文件(.c):定义逻辑文件内的函数,具体写出它们是如何实现的。

2)对于头文件,我当时在想如何让数组arry[]的大小参数化?arry[]的中括号里面只能放整型常数,你即使是const int n,去定义一个常变量也是不行的。解答:在头文件里定义符号的值去获得一个可以参数化的常量,”#define Max 100",以后需要修改,就改头文件里的define了。(这些设计写法都是类似的,像模具建模,草图也都是以一个参数为参考标数值,以后要改,改一个数就可以了)

3)我在自己写这个下棋的游戏时在想,我一定要枚举所有可能的情况吗?这样要考虑的面面俱到,有没有更简单的方法?之后看了课程,好像就是要枚举所有可能的情况,编译器总不可能帮你先知道有哪些结果吧。不知道哪些机器学习的能不能做到这点,之前看像什么阿尔法狗下围棋就自学棋谱,让一个小方块长腿自己学走路过障碍,不过这些也是去枚举所有可能的情况吧。
(自己能独立写出来,看来我之前在学校的C语言算是入门过了,现在还是继续系统深入学学,查漏补缺,继续进阶)


学习产出:

  • CSDN 无技术博客 1 篇

你可能感兴趣的:(c语言,学习)