4.1 函数的基本知识
返回值类型 函数名(参数声明表)
{
声明和语句
}
如果有返回值,那么一个函数的所有路径都需要有返回值
Linux下多个文件的编译
代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=28
4.2 返回非整形值的函数
如果先前没有声明过的一个名字出现在某个表达式中,并且其后紧跟一个左圆括号,那么上下文就会认为这是一个函数名字,并假定返回int
但上下文并不对其参数作任何假设.
代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=29
4.3 外部变量
如果变量定义在任何函数的外部,则是外部变量
函数的本质---堆栈视角
从堆栈的视角来讲解函数调用本质
****编译出来的exe还会有链接函数名吗?
函数的int返回值的本质是什么
什么是堆栈变量
----根据esp,ebp和变量的位置, 来说明变量就是放在堆栈里面的
为什么会堆栈溢出
----递归让堆栈溢出
----定义变量让堆栈溢出
变参函数的秘密
printf是怎么确定变量的个数的
printf("%d")会发生什么?
事实上,没有真正的变参,所谓变参实际上是某一个参数指明了参数的个数
visual studio的默认堆栈大小是多少?
除了堆栈变量,函数调用等也会使用堆栈.
代码: http://q1024.com/p/item.php?u=krc
视频:
https://www.bilibili.com/video/BV12L4y1Y76R?p=30
https://www.bilibili.com/video/BV12L4y1Y76R?p=31
https://www.bilibili.com/video/BV12L4y1Y76R?p=32
https://www.bilibili.com/video/BV12L4y1Y76R?p=33
所有的变量类型
1.外部变量: 也就是全局变量
2.静态变量: 用static修饰的变量
3.自动变量:也就是堆栈变量
4.寄存器变量(只适用于自动变量及函数的形式参数)
5.函数形式参数
所有的函数类型
1.外部函数:函数内不能定义函数,所有函数都是外部函数
2.静态函数:用static修饰的函数
变量/函数的定义与声明
1.真正干活的叫定义(分配内存空间)
如果是数组,定义一定要确定数组长度
2.辅助编译器编译的叫声明
声明不可以对变量进行初始化
如果是数组, 声明不一定要指定数组长度,也可以乱指定数组长度
外部变量(全局变量)
外部函数(因为函数不能定义在函数内部,所以函数都是外部的)
静态变量
外部静态变量
函数内部静态变量
作用域
作用域: 所有文件 单个文件 大括号内
1.外部变量(全局变量) 文件内的静态变量 大括号内的静态变量
函数参数
堆栈变量
外部函数 声明用static修饰的函数
初始化时机
初始化: 程序开始执行前初始化 看见时初始化
1.外部变量(全局变量)
2.静态变量 自动变量
寄存器变量
数组的初始化
1.省略长度,编译器会把花括号中初始化表达式的个数作为数组的长度
2.如果初始化表达式中的个数比数组元素少,没有初始化的将会被初始化为0,不能跳过前面的数组元素而直接初始化后面的元素
字符数组初始化比较特殊:
char pattern[] = "ould " 与 char pattern[] = { 'o', 'u', 'l', 'd','\0'};等价
代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=34
4.9递归
递归的本质就是函数调用,唯一的区别就是调用自己.
既然是函数调用,那就应该有个条件判断结束.
代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=35
4.11.1文件包含
#include""与#include<>的区别
""表示先从当前位置找,然后再从<>号的位置找
也就是""包含的位置大于<>号包含的位置
根据自己的需求来使用,一般来说,包含库头文件用<>号
介绍VS和linux下,指定包含路径的方法
4.11.2宏替换
查看宏展开:
VS: 工程属性--》配置属性--》c/c++--》预处理器
Linux gcc -E
-E Preprocess only; do not compile, assemble or link.
4.11.3条件包含
#ifndef HDR
#define HDR
/* hdr.h */
#endif
一般情况下,请用更加高级的#pragma once
代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=36