一、存储类型
auto:自动型 (修饰局部变量,局部变量省略存储类型时,会默认auto)
修饰的变量特点:(如果变量不赋初值)初值随机
修饰的变量存放在栈区
栈区:由系统自动开辟与释放
static:变量存放的位置在全局区
static的本质是延长变量或函数的生命周期,同时限制其作用域
作用域:
(修饰局部变量:和普通局部变量的作用域没有区别,但是可以延长生命周期
修饰全局变量:限制在本文件中使用)
static在函数内部声明的内部静态变量,只需初始化一次(没有赋初值置为0)。
而且变量存储在全局数据段(静态存储区)中,而不是栈中,其生命周期持续到程序退出。
![](https://img-blog.csdnimg.cn/img_convert/306f561155d24cc7890bfb209e7a8b1a.png)
未初始化的局部变量和全局变量存在.bss段
已初始化为0的局部变量和全局变量也存放在.bss段
已初始化的不为0的全局变量和静态变量存在.data段
例子:
#include <stdio.h>
int fun(void)
{
//初始化:定义变量的同时给变量赋值;
static int count = 10; //.data
//static修饰的变量只初始化一次,,
//下面使用的值,是上面运算后的结果
return count--;
}
int count = 1; //全局变量 //全局变量和局部变量可以重名
int main(void)
{
for(; count <= 10; ++count)
printf("%d,%d\n", count, fun());
return 0;
}
运行结果
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
static int count = 10;后,不会销毁count的值
二、函数
1.定义:函数是一个完成特定功能的代码模块,
2.格式:
(存储类型) 数据类型 函数名(形式参数)
{
函数体;
return 常量、变量或表达式;
}
3.调用:函数名(实参);
4.函数声明:数据类型 函数名(形式参数);
5.函数的传参:
① 值传递:只是将值进行传递,对传递的值不会产生影响(复制传递)
② 地址传递:将地址进行传递,在子函数中改变地址中的内容时,会对主函数的变量的值产生影响
③ 数组传递:int array(int a[], int n)
进行数组传递时,并没有将整个数组进行传递,而是传递的是数组的首地址
三、指针函数:
本质是函数,函数的返回值为指针
格式:
数据类型 *函数名(参数)
{
return 地址;//return NULL;
//return 0;
//return -1;
}
void *malloc(size_t size);
功能:手动申请空间,申请的空间在堆区
参数:申请的空间大小
返回值:任意类型指针
void *free(void *ptr);
功能:释放空间
参数:要释放的空间
返回值:无
void *fun(){} void可以匹配任意类型
四、函数指针:
本质是指针,指向函数的指针
格式:数据类型 (*函数指针变量名)(参数);
用法:
1)当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,
2)函数指针可以将函数作为参数传递给其他函数调用。
例子:
#include <stdio.h>
int add(int a, int b);
int main(int argc, const char *argv[])
{
//数据类型 (*函数指针名)(参数)
int (*p)(int,int) = NULL;
//赋值
p = add; //函数名是函数的地址
printf("add:%d\n",add(3,4));
printf("p:%d\n",p(5,6));
return 0;
}
int add(int a, int b)
{
return a + b;
}
#include <stdio.h>
int text(int a,int (*p)(int,int));
int add(int a, int b);
int main(int argc, const char *argv[])
{
//函数调用:函数名(实参);
#if 0
int ret;
ret = text(10,add);
printf("%d\n",ret);
#endif
printf("%d\n",text(10,add));
return 0;
}
int add(int a, int b)
{
#if 0
int a;
int b;
#endif
return a + b;
}
int text(int a,int (*p)(int,int))
{
#if 0
int a;
int (*p)(int,int);
#endif
return a + p(3,4);
}
指针函数和函数指针分别在什么地方用过?
当需要这个函数返回地址时,用指针函数。
函数指针:
signal函数参数 (信号处理函数)
pthread_create函数的参数 (线程的处理函数)
底层(file_operations结构体里成员())
#include <stdio.h>
#include <signal.h>
void fun(int sig)
{
printf("Signal:ctrl + c\n");
}
int main(int argc, const char *argv[])
{
//signal(int signum, void (*handler)(int));
signal(SIGINT,fun);
while(1);
return 0;
}
执行上述程序的时候,当键入Ctrl+C时,会输出“Signal:ctrl + c”
SIGINT信号:
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
signal(SIGINT,fun) --> signal函数的功能是:收到SIGINT信号,会去执行fun
五、函数指针数组:
本质是数组,数组的内容为函数指针
格式:数据类型 (*函数指针数组名[ 下标 ])(参数);
#include <stdio.h>
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int main(int argc, const char *argv[])
{
//数组:函数指针数组
int (*st[])(int,int) = {add,sub,mul}; //4*3 = 12
//int st[5]; sizeof(st)
//add(3,4)
//st[0](3,4);
//st[0] = add; //数组名[下标],st[1] = sub;
int i;
for(i = 0; i < sizeof(st)/sizeof(st[0]); i++)
{
printf("%d\n",st[i](4,3));//实参
}
return 0;
}
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
Linux(ubuntu)软件安装:
1.了解不同操作系统的软件包类型。
windows .exe
android .apk
ubuntu .deb
2.ubuntu使用的是deb的软件包
deb软件包分为:
二进制软件包:.deb (安装)
源码包:.dsc (软件源码)
3.软件包的管理工具:dpkg apt
1) dpkg
特点:
安装软件需要软件的安装包存在,不能从镜像站点获取软件包,
不能检测软件之间的依赖关系,安装不需要网络。
命令:
sudo dpkg -i 完整的软件包名:安装软件
sudo dpkg -r 软件名 :卸载
sudo dpkg -s 软件名 :查看安装状态
更多的参数也可以使用man手册查找 man dpkg
2) 软件包管理工具:apt ==>apt-get
apt-cache位置:/var/cache/apt/archives
特点:
安装软件不需要软件的安装包存在,能从镜像站点获取软件包,
能检测软件之间的依赖关系,安装需要网络。
apt-get:
sudo apt-get install 软件名:下载安装软件
sudo apt-get remove 软件名:卸载软件包
sudo apt-get update :更新软件源
sudo apt-get clean:清除下载的软件包
apt-cache命令:查看安装状态、依赖关系
sudo apt-cache show 软件名:获取二进制软件包的详细描述信息