版权声明:转载请注明出处,谢谢配合
注明:本博客只适用于有Java基础的人观看,因为java是c的升级版,所以下面我们会用java来与c比较
1.第一个C程序:HelloWorld.c
首先我这里是使用这个软件编写的:下载地址
安装过程一直next就好了
安装后在你的代码目录创建一个HelloWorld.c,代码目录可以随意,然后双击打开HelloWorld.c就可以默认进入我们下载的c开发软件中,如图:
其中图中标记为我们java中常用的编译和运行
下面就可以开始我们C语言的第一个helloWorld,通常说从helloWorld开始可以快速成为大神:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
代码中我们首先可以看到
1、
这个东西拿java来说就是我们通常的包名
2、main函数是主入口,和java一样
3、c语言中必须使用system(“pause”);使命令行暂停,方便观察程序的执行结果,否则结果会在你眼中一闪而过
2.C语言的基本类型与JAVA基本类型对比:
上一节中我们开始我们的第一个helloWorld,下面我们讲学习c中的数据类型:
- 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
- 29
- 30
- 31
- 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
- 29
- 30
- 31
从上面我们可以知道,c语言有以下几种数据类型:
char, int, float, double, long, short
使用char表示java的byte类型数据
使用char数据去表示java中String类型的数据
c的两种修饰符
signed, unsigned,
3.C语言中的输入输出函数:
上一节我们了解c语言的基本数据类型,下面我们看看c的输入输出函数:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
从代码中我们知道c语言的
输入:scanf();函数 根据地址去输入&j
输出:printf();函数
4.指针入门:
上一节我们学到了输入输出,下面我们将学习一个新名词指针
首先java中是没有指针这个名词的,
指针是什么? 指针就是一个地址
地址代表的就是一块内存空间
指针变量是什么? 用来存放指针
从上面我们就可以知道java中的内存控件就是c语言中的指针,下面我们看下代码:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
从代码中我们可以知道:
-
指针就是地址,而c语言中我们在变量前面加上&符号就可以到地址也就是指针如:int i=9;那么i的指针表示方式是&i
-
指针变量就是用来存放指针的一个变量,如:数据类型* 变量名;如:int * p 这样就是一个指针变量,将我们上面的&i=p这样我们就将i的指针放在了指针变量p中
-
得到指针变量中的值使用符号*,例如我们将上面指针变量p的指针i的值取出来表示就是:*p
-
*p 和i 其实代表的是同一个变量,代表是同一块内存空间
5.指针介绍:
上一节我们已经知道了指针和指针变量的用法,下面我们将通过一个小程序进一步说明指针
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
从代码中我们编写了一个for循环,打印time指针值,可以在命令行程序已经在开始走了
从图中可能大概你们可以看到我使用一个外挂软件找到了time指针值,外挂地址
怎么使用外挂软件:
- 首先点击图中的箭头图标,
- 弹出Process List在里面找到我们的程序,然后点击,
- 左边Address栏就会出现我们程序中的time地址
从图中我们居然看到我们的程序运行到22的时候怎么又从59开始了,正常情况下我们是21啊,这是怎么回事呢?
哈哈,这其实就是用到了我们上图 中的外挂,首先我们使用外挂找到我们的time地址,然后将time 的值改为60之后就发现命令行又从60开始了。
通过这个外挂我们就更加深刻了解指针的作用,下面我们将使用几个案例去了解指针的一些细节
6.案例:使用指针交换两个数据:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
7.案例:使用指针获取子函数的数据:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
8.案例:使用指针返回一个以上的值
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
6.7.8案例总结:
1.子函数在main函数中调用结束后会被销毁,随之传入的形参也会被销毁
2.main函数里的数据要想通过子函数进行交互,子函数的传入的参数必定是指针变量
3.方法中的返回值不能像java中一样返回集合之类的数据,通过指针去返回多个数据。
9.指针的常见错误:
通过6、7、8节我们细致的了解了指针,下面我们将讲解指针的一些错误:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
错误总结:
1.指针变量中必须得有指针,否则在取指针变量中的指针的值的时候会异常
2.不能给没有定义指针的指针变量的指针的值赋值
3.指针变量和指针的数据类型必须一一对应
10、指针占多少个字节:
之前第二2节中我们知道了c的基本数据类型的字节数,那么指针占多少个字节呢?
看代码:
- 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
- 29
- 30
- 31
- 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
- 29
- 30
- 31
首先我们定义了不同的几个变量,然后将他们的地址放入指针变量中,最后输出,我们居然发现输出结果都一样。
总结:
- 指针变量的内存大小是固定的,与数据类型没有关系
- 指针变量的内存大小最终取决于我们的电脑
11、使用char* 指针表示字符串
在第二节中我们知道,c语言中是使用char数组去表示一个java中的String字符串,
在我们学习指针之后我们将看看怎么用指针更加简单的表示一个字符串:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
从代码中我们可以看到使用char数组的方式是比较复杂的,然后我们使用指针的方式:char* arr1=”“,这样就可以简单的直接表示一个字符串
注意:在java中我们定义数组可以int arr[]; int [] arr;但是在c语言中[]只能卸载变量名后面,如:int arr[]
12、指针与数组
指针进阶:
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
总结:
- 语言语法上没有数组越界,在逻辑上存在数组越界,
- arr是一个指针,arr的指针就是&arr[0]的指针,也就是说数组的指针就是数组第一个元素的指针
- 数组中的数据的指针是一块连续的内存空间
- arr[i]等同于*(arr+i)
13、指针的计算
通过上一节我们大概知道了指针与数组的关系,下面我们通过一个案例去巩固一下:
- 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
- 29
- 30
- 31
- 32
- 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
- 29
- 30
- 31
- 32
总结:
- 数组中的数据的指针是一块连续的内存空间
- 指针的运算按照约定好的数据类型偏移相对应的内存空间的大小
14.案例:通过子函数打印数组
- 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
- 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
总结:
- int arr[5]; 这一句代码一旦执行 ,就立刻会在内存里面申请 5个内存空间 每个内存空间的大小可以存放一个int类型的数据
- 留下疑问:没有办法动态的增加这一块空间的大小, 也没办法减小这一块内存空间,只能提前写死,例如我们代码中arr[10],直接就将我们的arr数组大小写死了
15、realloc()方法介绍
在上一节中我们留下的疑问是不能更改数组的内存控件,而realloc()方法则完美解决了这个问题,具体使用方式:
- 1
- 2
- 1
- 2
首先我们可以看到realloc接收两个参数:
- 第一个参数表示你需要更改大小的变量
- 第二个表示更改之后的长度
我们了解了realloc()方法是可以更改变量内存大小的,那么就会存在这样一个问题,改变之后的内存会不会覆盖之前的数据呢?
-
对于增加内存:realloc是直接在原有的基础上添加内存空间,所以还是会保持原有的数据再进行添加
-
对于减少内存:realloc是会将排列在最后的内存空间值给回收掉的,
比如原始数据int arr[4]={1,2,3,4};减少2个内存的话,就是int arr[8]={1,2}
16、动态分配内存
前面我们看到我们定义的那些函数变量等,都是由系统给我们自动分配内存,我们是不用去理会系统到底什么时候去给我们分配,什么时候去回收,
而接下我们要学习的是自己去管理内存即动态分配内存,看代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
代码中我们首先如java导入类的方式,在代码上面添加了一行:
这个就是动态内存所要用到的方法了,接下来我们在main函数中
int* p = (int*)malloc(sizeof(int));
这样我们即给指针变量p分配了int字节大小的内存空间,完成了一个动态分配内存的操作
这样我们就可以使用如上方式去解决上一节中的疑问了
学到的知识点:
- malloc(byte length)方法用于动态申请内存。
- 动态申请内存其实就是在申请指针
疑问:
- 我们之前看到的,函数使用完成后是会被回收掉的,难道我们动态申请内存怎么被回收呢?不然是会浪费内存空间的
17、动态分配内存2
在上节中我们已经知道了malloc(byte length)方法是用来动态分配内存的,
下面我们将通过一个小案例来进一步讲解动态分配内存,并且解决上一节中的疑问
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
首先我们看到是f(int** address) 其中int **表示的是多级指针,下面我们会详细介绍,在这里只要知道他是一个存放指针变量的指针变量就行了,
然后定义一个指针变量p并动态分配内存和赋值,
最后将p传递给f(int** address)的形参
接着我们看到main函数中我们使用了f()函数并得到了f()函数中的值
细心的同学可能可以看到我们在f()方法中可以看到我们注释的一个函数:free(p)
free(p):将动态释放的内存给回收,使用free(p)函数即可解决我们在上一节留下的疑问,其中p是我们需要释放内存的指针变量
接着我将free(p)打开,按理说p分配的动态内存空间的数据是会被free(p)执行后给回收的,最后居然发现在main函数打印(q+0)为0,(q+1)为4,(q+2)为5,
结果可想而知free(p)难道只将第一个数据给回收了?其实在执行free(p)之后确实将p给回收了,(q+1)为4,(q+2)为5,只是残留的映像,在回收过程中只是将p的内存空间标记为可以再次写入,其实真正并没有彻底回收,所以会出现这种情况
18、多级指针
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
一个*表示一级指针,二个*表示二级指针,以此类推
19、函数的指针
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
代码中我们定义了一个返回值int的add函数,在main函数中使用函数指针给add函数赋值,输出
函数指针使用步骤:
1.定义int (pf)(int x, int y):返回值 (*函数指针别名)(参数列表)
2.赋值 pf = add;
3.引用 pf(3,5);
20、结构体
结构体是c中的新名词,和java中的类是一样的
- 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
- 29
- 30
- 31
- 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
- 29
- 30
- 31
从上面的代码我们可以看出首先定义除了一个Student的结构体,结构体用struct 修饰
Student定义了四个变量,
-
给变量赋值:在main中通过 struct Student st={80,55.6f,100010 ,’F’}; 的形式给变量赋值
-
打印变量1:如同java里一样类名.变量名,结构体名.变量名,如:我们这里是st.age…..
- 打印变量2:首先定义一个Student类型的结构体指针变量pst,将结构体对象的指针&st放在该指针变量pst中,最后使用(*pst).变量名的方式打印,如:(*pst).age,
- 也可以使用->符号来输出,例如我们上面的:pst->age,表示pst所指向的结构体变量中的age这个成员,在计算机内部会被转换为 (*pst).age
注意:结构体的长度是根据结构体中数据类型最多的字节大小*变量的个数,如果字节数一样,则按字节数大的来计算,例如:我们上面有3个变量的字节数为4,所以导致结构体的大小为16,如果我们的char类型为3个则是8,如果有两个4个字节的数据,两个2个字节的数据,则结构体的大小为16
结构体的常见几种表示方式:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
21、联合体:
首先联合体使用union 修饰,如:union { long i; int k; char ii; } mix;
联合体 是定义一块相同的内存空间 存放里面的数据
联合体的作用就是用来表示一组数据类型 数据的数据类型为这一组中的某一种数据类型
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
从结果我们可以看出结构体输出的长度为4,按理说我们里面有三个数据,光long就为4,
这是因为mix.I mix .k mix.ii共用相同的地址,它会自动取最大的数据类型字节数为它的大小
代码中我们将mix.ii=’A’,输出mix.k发现也是65,所以我们可以很快得出一个结论:
联合体里面的数据内容会相互覆盖
22、枚举
在java中我们知道也是 有枚举的,用enum修饰,c语言在这一方面是完全一样的:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
输出6
如果将Monday做以下改动:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
将输出15
使用很简单的,很java一样
23、typedef
typedef意义:声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。
例如:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
输出3,
我们从代码中首先我们在main上方定义了一个 typedef int haha:表示用haha去代表int类型的数据,然后下面我们就可以在main函数使用haha定义变量赋值
24、预处理
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 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
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
文件包含:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
25、static与extern对函数的作用:
- 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
- 29
- 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
- 29
26、extern与static对成员变量的作用:
- 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
- 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
演示一个神奇的情况:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
27、static对局部变量的影响:
- 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
- 29
- 30
- 31
- 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
- 29
- 30
- 31