我在华清大型连续剧之Linuxc高级

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

举个栗子

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值