一个菜鸟的Linux起步 课程第三节:动态库的封装,gcb调试,左右法则,左值右值,数据类型

动态库的封装(add.c)
  1. 创建库函数的源文件: vim add.c
  2. 生成目标文件: gcc -c add.c -fpic
  3. 生成动态库:gcc add.o -o libadd.so -shared
备注:libadd.so:add是库的名字 so是后缀
  1. 建立调用函数库的源文件:vim demo.c
  2. 编译执行: gcc demo.c ./liadd.so (这里的动态库是在当前目录下的)

静态库和动态库的区别
  1. 静态库的后缀是.a 动态库的后缀是.so
  2. 在编译链接的时候
对于静态库,链接器是把静态库里面的函数拷贝到调用的地方,调用一次拷贝一次
对应的实验现象:mv libmath.so ../之后,./a.out是可执行的。
对于动态库,链接器是在调用的地方做标记,调用的时候再去动态库里加载。
对应的现象:mv libmath.so ../之后,./a.out是不可执行的。

  1. 链接动态库的可执行文件一般比静态库的要小;
  2. 默认的连接方式是动态链接,如果要静态链接,需要加入参数 -static


gcb调试:
主要的作用就是用来调试代码,可以做到单步调试,或者从一个断点直接到下一个断点,甚至是改变当前程序的执行条件,按照我们设定的条件执行
---调试查找错误,并使程序按照我们设定的条件执行。

gcc -g countnine.c -o demo1; -g加入调试信息到可执行文件里;
gcc countnine.c -o demo2;
实际开发中:debug版本和发布版本(release版本)的可执行文件

进入到调试环境中:gdb debug版的可执行文件

break 程序的行号/函数的名字:打断点
info break :查看断点
run: 执行
step 单步执行(遇到函数,仍会进入函数里面进行单步执行)
next (遇到函数,不会进入函数里面进行单步执行)
delete 断点编号:删除断点
continue: 执行到下一个断点(如果下面没有断点,一直运行到程序结束)
return: 从当前函数返回(调用该函数的地方)
print: 显示变量表达式的值
x: 显示内存值
backtrace: 显示调用栈
quit: 退出gdb
symbol-file:从可执行文件中加载符号表
list: 列出源码


c语言:用变量a给出下面的定义:①一个整型数;int a②一个指向整型数的指针;int *a③一个指向指针的指针,它指向的指针是指向一个整型数;int **a④一个有10个整型数的数组;int a[10]⑤一个有10个指针的数组,该指针是指向一个整型数的;⑤一个指向有10个整形数组的指针;⑦一个指向函数的指针,该函数有个整型参数并返回一个整型数;③一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;


定义变量或者解析定义时,用到的 左右法则
→int (*a[10])(int)
→首先找到变量名a,先往右看是[ ],说明a首先是一个数组,[ ]内是10,表明数组有10个元素;(此时反问自己,数组里保存什么 类型的变量)
→再往右看,看到 ),此时转向向左,看到* ,表明数组里保存的变量是指针变量。(问,指针变量指向什么地方?)
→继续向左,看到( ,转向右看,遇到( ),说明指针变量指向函数,( )里面是int,表明函数的形参只有一个,并且是整形的参数。
→又转向左,遇到int,说明函数的返回值是int 类型的。

int add(int a,int b);
函数的名字;
函数的形参;
函数的返回值;

左右法则:
首先找到变量名,往右看,每次遇到括号调转方向,直到把定义解析完毕。

强调:
  1. 遇到数组,问,数组内有多少元素?元素是什么类型的?
  2. 遇到指针,问,指针指向的变量是什么类型的?
  3. 遇到函数,问,函数的形参有没有?有的话有几个?每个形参又是什么类型?函数的返回值是什么?

左值右值:
int a = 12;
解析: 程序里面定义了一个int型的变量,变量名为a,并且把变量初始化为12;
编译器编译到这一行时,会在内存里面分配一块空间,空间有多大?→int 字节的大小
这个空间的名字叫 a ,并且把12这个数放到a所对应的空间里。
a在=的左边,叫左值,表示的”对应的空间”;
12在=的右边,叫右值,表示“数据”

初始化和赋值
在定义变量的时候就给变量赋值,叫初始化;
在定义变量之后,再对变量进行操作,比如改变变量的值,叫赋值

变量的作用范围;
全局变量:作用范围是整个的 .c文件
局部变量:作用范围是{ }所在的代码块
当全局变量和局部变量作用范围重合时,就近取值。

数据类型:
基本数据类型:int float char double long short

数据为什么要有数据类型?
  1. 表示的数的种类不一样:整数和小数
  2. 跟我们的取值范围有关系;
  • 计算机里的变量是需要介质来保存的;→ 为了给变量或者数据分配“合适”的储存空间 → 数据类型
sizeof:运算符,不是函数,主要是用来计算变量或者数据类型在内存中所占空间大小
→ 计算字符串在内存中所占空间大小时,将\0计算在内;
strlen:函数;
一个字节是8位,每一位只能用0或1表示
bit7 bit0
最高位 最低位

数据类型的取值范围:
有符号和无符号:
有符号:既可以表示正的,也可以表示负的;最高位只表示正负,不参与数据储存,0表示正,1表示负
无符号:只能够表示非负的;最高位参与储存
char为例:
signed char :
最大
最小
unsigned char:
最大
最小

原码,反码,补码
数据在计算机里保存时,都是以补码的方式保存的。

正数:三码一致
负数:补码:绝对值按位取反再加一


运算符:
+ - ×
i++:先运行,后加一
++i:先加一,后运行

scanf(“控制格式”,地址);
作用:从终端(键盘)获取所输入的数据,按照“控制格式”保存到“地址”所对应的空间里;
scanf(“”)
scanf(“”)
gets():获取字符串

作业 :printf scanf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值