c

1.malloc

在c99之后如今可以动态数组,所以可以这么干

 但是c99之前是不能的,所以需要动态分配malloc来,

 但是malloc是返回void*的所以前面还需要类型转换一下

所以就是如下

 当然 最后还需要free一下。

2.字符串操作

 看一点例子

 其实看清本质下,可以自己写出这种函数

这种不知道在哪停止的就不能用for循环就只能while

 

 

下面看看字符的输入输出

 

 我们来一个简单的案例输入输出

 运行就是输入什么输出什么

 结果发现就算命令行输入EOF但程序还是没有结束

 首先需要知道电脑键盘与程序之间有一个Shell

 所以在回车之前都存放在shell

 

 所以从这里看出我们写入到shell的内容到了程序不一定是原封不动的。

二维数组的第二维是一定要确定的大小的。如

 编译是过不了的

所以需要这样

 什么意思呢,就是说

a是一个数组,这个数组里面每一个单元是一个char[10],

 所以超过就会报错如

 所以是不太好的写法,应该这样

 这样a[0]就相当于char*了

这两种情况就是这样,一个是固定分配好了10个空间,另一个是指向一个地址。通过地址找到内存单元里的值,内存单元可以无限空间。

3.指针

与其他高级编程语言相比,C 语言可以更高效地对计算机硬件进行操作,而计算机硬件的操作指令,在很大程度上依赖于地址。

指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。在一定意义上可以说,指针是 C 语言的精髓。

指针如*p其实就是取地址,是地址,所以经常也看到函数的参数是指针时其实也可以说是代表一个数组的识位置,就算数组作为参数,其实也是以指针的方式传递进去的。

内存与地址

在计算机中,数据是存放在内存单元中的,一般把内存中的一个字节称为一个内存单元。为了更方便地访问这些内存单元,可预先给内存中的所有内存单元进行地址编号,根据地址编号,可准确找到其对应的内存单元。由于每一个地址编号均对应一个内存单元,因此可以形象地说一个地址编号就指向一个内存单元。C 语言中把地址形象地称作指针。

C语言中的每个变量均对应内存中的一块内存空间,而内存中每个内存单元均是有地址编号的。在 C 语言中,可以使用运算符 & 求某个变量的地址。

 

 

 

 如 以下这种就是错误

 这时候有可能*p是一个莫名其妙系统初始的值或者随机的值,然后操作*p等于12会造成什么呢,就是这个随机的地址的内容即内存单元即字节等于12

 当然也可以自己赋值*p=0或者100,但是依然是一个地址,下次指向的时候依然是混乱的

记住这个即可----(**p)*指针,时是一个内容单元

4.l链表1----可变数组

 那么这个结构体里面其实本质就是一个可变的数组,

但是我们发现基本这个结构都是作为参数传入到函数,同时作为参数肯定用指针,

所以有时候会有人这样初始

(注:这个只是部分,本页的代码与之无关,只是见识一下这种类型)

 下次直接初始a 则就是一个指针。但这样的坏处是a就不是一个本地变量了。

比如如下的函数里面,如果用的*Array那么无法,返回,因为返回也只是一个指针对吧

所以最开始的结构体才是用的Array

 当然既然在创造的时候malloc了空间,那么在array_free里也要free结构体,但是结构体的初始化时指针int *array所以free也是array

 然后就是一些以其他操作

 但是数组每次动态分配内存比较大,数组是一定知道大小的,不是我们自己输入大小,就是定义一个变量叫用户输入大小,或者有一个条件。

如不不知道大小,也不要大占内存

所以

4.2链表

 

 typedef其实就是告诉这个结构体叫Node

下面来看一个例子

这个例子很容易内存泄漏,head为空等情况,会忘了add返回值等问题

所以再优化一下,我在内部就把head赋值,直接函数里面就完全搞定了不用再申明返回出来在赋值等操作

 

 而且这个时候这个List就成为了我们的链表,特别方便。然后后面就是一些加代码

原文地址:https://www.cnblogs.com/yangj-Blog/p/14221277.html