第三节课内容

动态库的封装:【add.c】
1、创建库函数的源文件:vim add.c 和vim sub.c
2、生成目标文件夹:gcc -c add.c -fpic
3、生成动态库:gcc add.o -o libadd.so -shared
【备注:libadd.so:lib是前缀,add是库的名字,so是后缀,代表的是动态库】
4、建立调用库函数的源文件:vim demo.c
5、编译执行:gcc demo.c ./libadd.so
     【备注:这里的动态库是在当前目录下的】


动态库和静态库的区别:
1、静态库的后缀是.a,动态库的后缀是.so.;
2、在编译链接的时候,对于静态库,链接器是把静态库里的函数拷贝到调用的地方,调用一次   拷贝一次====》对应的实验现象是:mv libadd.a ../之后,./a.out是可以执行的;而对于动态库,链接器是在调用的地方做个“标记”,调用的时候再去动态库里去进行加载!
===》对应的实验现象:mv libmat.so ../之后,./a.out是不可以执行的;
3、链接动态库的可执行文件一般比链接静态库的可执行文件要小;
4、默认的链接方式是动态链接!如果要静态连接的话,加个参数-static


gdb调试:
主要的作用是用来调试代码的错误可以做到单步调试,或者从一个断电执行到下一个断点,甚至是改变当前的程序的执行文件,按照我们设定的条件进行执行!
【countnine.c为例】
gcc -g countnine.c -o demo1; -g加入调试信息到可执行文件里面;
==》gcc countnine.c -o demo2
==》比较下demo1和demo2的大小;
==》实际开发中:debug版本和发布版本(release版本)的可执行文件!


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


打断点:
break  程序的行号
或者
break  函数的名字
查看断点:
info break
执行:
run
单步执行:
step 【遇到函数,会进入到函数里面进行单步执行】
next 【遇到函数,不会进入到函数里面进行单步执行】
删除断点:
delete  断点编号
执行到下一个断点:
continue 【如果接下来没有断点,一直运行到程序结束】


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


定义变量或者解析定义的时候,用到的左右法则:
===》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 = 18;
在定义变量之后,再对变量进行操作,比如改变变量的值,叫赋值;     int a;a = 18;


变量的作用范围:
全局变量:作用范围是整个.c文件;
局部变量:作用范围是{}所在的代码块;
当全局变量和局部变量的作用范围有重合的时候呢?
县官不如现管!!!


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


char为例:
signed char:
最大的:正的!==》0111 1111 = 127
最小的:负的!==》1111 1111 = -127
存在的问题:0000 0000 = +0 和 1000 0000 = -0
印度:-128; [-128,127]
unsigned char:
最大的:1111 1111
最小的:0000 0000


原码、反码和补码:
数据在计算机里面保存的时候,都是以补码的方式保存的!


正数:原码反码补码都是一样的;
负数:负数的补码是负数的绝对值按位取反再加一;
-1的补码计算:
-1的绝对值:0000 0001==》1111 1110==》11111111
运算符:
+、-、*、/、%、i++、++i
i++:先使用再加一;
++i:先加一再使用;


scanf("控制格式",地址);
作用:从终端(键盘)获取输入的数据,按照“控制格式”保存到“地址”,所对应的空间里面;
scanf("%d",*&a);
scanf("%d",&a[0]);
发布了23 篇原创文章 · 获赞 20 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览