main函数
正确写法
int main(void)
int main(int argc,char ** argy)
int main(int argc,char* argy[])
错误写法,不标准(运行起来没有任务问题,但是其实某些编译器不行,或者父进程拿不到这样的返回值)
void main()
float main()

main函数返回给谁
1.函数为什么需要返回值:
返回值是函数的输出,也是一个值。

main函数被谁调用
1.main函数是特殊的,首先main这个名字是特殊的,其它函数不能使用该函数名,main函数是程序的整个入口。,其它函数都会被它直接或间接调用
2.main开始代表当前程序开始,main结束代表整个程序结束。
3.谁执行了程序,谁就调用了main
4.谁执行了程序?或者说程序有哪几种被调用执行的方式?

linux下程序执行的几种方式
1.命令行执行./hello执行程序
2.通过shell脚本调用执行程序
3.在程序中调用另外一个程序(System函数(fork exec))

进程和程序之间的关系
进程的生命周期:创建,加载,运行,消亡
创建一个新的进程(创建),然后把程序丢进这个进程(加载)去执行(运行)直到结束(消亡)。

新进程是被谁创建的?
其实都是被它的父进程调用的。
例如:命令行本身就是一个进程,在命令行中执行./hello执行一个程序,其实就是将这个程序作为命令行的一个子进程去执行。
所以说main函数返回给调用这个函数的父进程,一般返回0表示执行成功,返回负值表示失败(shell脚本会把main函数返回值放在$?符号中)

谁给main函数传参
(1)父进程给main函数传参,并接收main返回值。
(2)argc(表示我们给main传了几个参数)和argv(传参的数组,argv[0]是./hello执行命令)是C语言预定义的。

传参的本质:
父进程fork一个子进程,然后子进程和一个程序绑定起来,然后再去执行exec,然后在exec的时候同时传入参数。

C语言中的NULL
1.NULL不是C语言关键字,本质上是一个宏定义
#ifdef _cplusplus(C++的意思,为了区分C语言和C++,看是C语言编译器还是C++编译器)
#define NULL 0
#else
#define NULL (void *)0 //C语言的NULL,表示指针变量的值是0,也就是指针变量指向0地址,但长度不知道
#endif
NULL的本质是0,但是不是当作一个数字来解析的,是当作地址0x0000 0000来解析的,代表内存的0地址
int *p;//p是一个函数内的局部变量,p是随机的,野指针
int *p = NULL,表示p是一个函数内的局部变量,指针指向内存的0地址,这时候p就不是野指针了。

float a = 12.34
int b = (int)a
问:为啥a的值还是12.34
是因为有临时匿名变量,将12.34的整数部分12方在另外一个地方,然后再赋值到b中,然后再销毁这个临时匿名变量