《跟着星仔学C语言》第四章 函数与程序结构

04_0100 4.1 函数的基本知识

4.1 函数的基本知识
返回值类型 函数名(参数声明表)
{
    声明和语句
}

如果有返回值,那么一个函数的所有路径都需要有返回值

Linux下多个文件的编译
代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=28

04_0200 4.2 返回非整形值的函数

4.2 返回非整形值的函数

如果先前没有声明过的一个名字出现在某个表达式中,并且其后紧跟一个左圆括号,那么上下文就会认为这是一个函数名字,并假定返回int
但上下文并不对其参数作任何假设.


代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=29

04_0300 4.3 外部变量

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

 04_0400 4.4 作用域规则 4.5 头文件 4.6 静态变量 4.7 寄存器变量 4.8 程序块结构 4.9 初始化


所有的变量类型
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

04_0500 4.9递归

4.9递归

递归的本质就是函数调用,唯一的区别就是调用自己.
既然是函数调用,那就应该有个条件判断结束.

代码:http://q1024.com/p/item.php?u=krc
视频:https://www.bilibili.com/video/BV12L4y1Y76R?p=35

04_0600 4.11 C预处理器

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

 

posted @ 2022-09-06 21:21  xingzaicpp  阅读(60)  评论(0编辑  收藏  举报