Linux部分:
命令:安装软件、压缩解压、文件、进程管理命令、网络配置。
shell脚本:变量、功能语句、控制语句、数组。
makefile:gcc
c高级:
指针函数、函数指针、存储类型、分文件编程、条件编译。
【1】指针函数
本质是函数,函数的返回值是指针
2、char *fun()
{
char*p=malloc(32);
strcpy(p,"hello");
return p;
}
main()
{
char*p=fun();
printf("%s\n",p);
}
在堆区手动开辟空间,手动释放。
char*fun()
{
char buf[32]="hello";//局部数组,函数调用结束空间释放
//想要在main函数中拿到hello字符串,解决方式:
1、指针指向常量区数据
char*p="hello";"hello":存放在常量区,程序结束空间才会释放,p存放在栈区
【2】函数指针
本质:是指针,指向函数的指针
格式:数据类型(*指着变量名)(参数列表);
数据类型:和指向函数的返回值类型一致
参数列表:和指向函数的参数列表一致
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
//函数指针作为另一个函数参数,实现接口重用->多态
int test(int (*p)(int, int)) //p = sub / p = add
{
printf("%d\n", p(3, 4));
return 0;
}
int main(int argc, char const *argv[])
{
// 函数指针
int (*p)(int, int);
p = add;
printf("%d\n", p(2, 3));
p = sub;
printf("%d\n", p(2, 3));
test(sub); //-1
test(add); //7
}
【3】函数指针数组
本质:数组,数组中存放函数指针
格式:数据类型(*数组名【元素个数】)(参数列表));
int (*arr【3】)(int,int)={函数名};
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int main(int argc, char const *argv[])
{
int (*arr[3])(int, int) = {add, sub};
// arr[0] = sub;
for(int i = 0; i < 2; i++)
printf("%d\n", arr[i](3, 4));
return 0;
}
练习:
a) 一个整型数 int a
b)一个指向整型数的指针 int*p=&a
c)一个指向指针的的指针,它指向的指针是指向一个整型数 int**q=&p
d)一个有10个整型数的数组 int arr[10]
e) 一个有10个指针的数组,该指针是指向一个整型数int*arr [10]
f) 一个指向有10个整型数数组的指针 int(*p)[10]
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数 int(*p)(int)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
int(arr*[10])(int)
【4】存储类型
定义变量、数组、指针、函数、会用到存储类型
作用:决定变量等在内存中的存放位置
存储类型 数据类型 变量名
存储类型:决定变量等在内存中的存放位置
数据类型:决定变量在内存中占的字节大小
栈区、堆区、、全局、常量区、代码区
1、auto :
自动型、修饰局部变量,存放在栈区
2、static:
静态型,可以修饰局部变量和全局变量也可以修饰函数
static int a=3
1,存放全局区/静态区,.bass区(未初始化的全局变量和静态变量).data区(初始化的全局变量和静态变量)
2,初始值默认为0,只初始化一次
3,限制作用域:修饰全局变量将全局变量限制在本文件中使用,修饰局部变量将局部变量限制在本函数中使用
4,延长生命周期:修饰局部变量时,变量的声明周期为整个程序
3、extern:
外部引用:可以引用其他文件中的全局变量和函数,在本文件中使用。
num.c:
#include <stdio.h>
// int num = 10;
static int num = 10;//加static后num变量只能在本文件中使用
void fun()
{
printf("hello world\n");
}
main.c:
#include <stdio.h>
extern int num; //外部引用num.c中的全局变量num
extern void fun(); //外部引用num.c中的函数
int main(int argc, char const *argv[])
{
printf("%d\n", num);
fun();
return 0;
}
4、register:
寄存器类型 registern int a;
1,不能对寄存器变量进行取地址操作
2,因为寄存器类型有限,并不是所有的寄存器变量都可以存放在寄存器中,当存不下时和auto存储类型使用一样
? 分别static和const的作用
【5】分文件编程
头文件:xxx.h
包含main函数的.c:main函数
包含子函数的.c:子函数的定义
数据类型 函数名(参数列表){}
如果代码中需要定义全局变量,可以在.c文件中进行定义,其他文件如果要引用,在.h文件中加extern进行声明
#include<stdio.h>//从系统路径中查找文件
#include"head.h"加载当前路径下的头文件
头文件默认查找路径、/usr/include
【6】条件编译
按照条件是否满足决定代码是否被编译
1.根据宏是否定义
#ifdef 宏名
/*code1*/
#else
/*code2*/
#endif
2.根据宏的值
#define 宏名 值
#if 宏名
/*code1*/
#else
/*code2*/
#endif
3.防止头文件重复包含
#ifdef 宏名
#define 宏名
/*code*/
#endif
举个栗子