内存存储空间
①栈存储区 3G内存大概不到8MB,专用处理持续时间较短的变量
所有数据类型+变量名声明的局部变量都会在栈内存上申请空间
特点:自动申请,自动释放,在声明变量的同时自动为该变量申请相应的内存空间,当
生命周期结束时内核自动释放空间的使用权;先进后出
在栈空间中严禁返回一个局部变量的地址
int *func(){
int a = 5;
return &a;
}//不允许这么写,此函数调用完后返回值是一个野指针,在main函数中接收此返回值>会导致段错误;
int *func(){
int a = 5;
int *pa = &a;
return pa;
}//此写法被允许,在main函数中用int *pa = func()接收后,printf("%d",*pa)值为5
<>会到根目录下的usr目录下的include目录下的寻找对应文件/usr/include
②堆存储区
③常量存储区
④静态存储区
全局变量、静态全局变量、静态局部变量、静态函数
特点:静态存储区会在主函数开始之前的时候同时存在直到主函数结束时被销毁(生命
周期)。
全局变量存在于静态存储区并且不属于任何作用域所以整个程序中的任何地方都能随意
访问。
当不适用extern取引用一个全部变量时,如果引用失败新定义一个变量,如果引用一个
static外部变量,直接引用失败,编译错误。
static对于全局变量来说作用是限制其作用域;
static静态局部变量,此时static的作用是延长其生命周期,由于将栈上面的变量放在
了静态存储区。
静态函数:使用static,只允许在声明的地方被调用,并且static函数不会在栈空间中
运行而是在静态存储区运行,
普通函数在栈空间中可以有多分内存来运行多次调用,而static在静态存储区中只会有
一份内存在静态存储区中来运行多次运行调用。
从静态函数引发了一个问题,
带参宏,函数,内联函数和静态函数的区别:
带参宏:因为在预处理阶段被替换成代码,所以是以代码的形式参与运行的,根本没有
自己的栈空间,用的是主函数的资源。
函数:拥有自己的栈空间,在函数运行时一旦函数调用就会发生控制转移并且在函数自
己的栈空间中完成所有运算。
可变参函数
#include <stdio.h>
#include <stdarg.h>
/*
在设计时可以不考虑参数,调用时要考虑
可变参数认为规定:第一个参数(固定参数)决定了后面有几个参数;
如何声明一个可变参函数:
返回值类型+函数名(固定参数类型及名字,……)
void func(int a,…){
va_list p = 0;
va_start(p,a);
int res = 0;
for(int i = 0;i<a;i++){
res = va_arg(p,int);//带参宏,不是函数p指向第一个值以Int方式取出
printf("%d\n",res);
}
va_end§;
return 0;
}
int main(){
int res = func(1,3,5,7);
return 0;
}
*/
/*
在函数内部重新调用自身的行为
递归三要素:
①自己调用自己
②递归的退出点
③每一次递归必须趋近于退出点
④在递归函数中严禁使用静态局部变量
递归的思路:
当遇到一个复杂问题的时候,我们无法得到它的解,我们可以将之分解为简单的问题,
若果还是不得解,再次分解成简单问题,知道分解为足够简单,能轻易得到答案再逐层向上
解决复杂问题
使用循环解决问题肯定会曹成时间上的复杂,但空间复杂度为0;
使用递归如果逻辑正确使得时间负责度低,如果不合理递归的时间比循环还复杂
如果算法合理在大量数据面前递归的时间复杂度是循环的千分之一,
*/
void func(int num){
printf(“1\n”);
if(num<=0){return;}
func(num-1);
}
}
#include <stdio.h>
int main(){
func(5);
return 0;
}