在计算机编程中,句柄(Handle)是一种用于标识和引用系统内部对象的标识符。句柄通常是一个不透明的指针或整数值,它代表了一个系统资源,如文件、窗口、进程、线程、内存映射文件等。句柄的主要作用是在程序中引用这些资源,而不需要直接访问它们的底层实现细节。
在C语言中,虽然可以直接调用函数,但有时候我们需要使用函数指针来实现一些特定的功能。函数指针是一个指向函数的指针,它可以存储一个函数的地址,从而允许我们通过该指针来调用该函数。下面是一些使用函数指针的理由:
1. 回调函数:•函数指针常用于传递回调函数,即一个函数被作为参数传递给另一个函数,并在适当的时候由后者调用。•这种模式在处理事件驱动编程时非常有用,例如GUI编程或者网络编程中的事件处理。
2. 策略模式:•函数指针可以用来实现简单的策略模式,即在运行时动态选择不同的算法或行为。•例如,排序函数可以接受一个比较函数作为参数,根据这个比较函数的不同实现,排序逻辑也会有所不同。
3. 通用接口:•使用函数指针可以让函数或库更加灵活,因为它们可以通过函数指针参数来适应不同的需求。•这样可以使代码更加模块化和可扩展。
4. 延迟绑定:•函数指针可以实现动态链接和延迟绑定,允许在运行时决定调用哪个函数。
5. 多态:•虽然C语言本身不支持面向对象的多态性,但可以通过使用函数指针来模拟多态行为。•例如,可以定义一个结构体包含多个函数指针,每个函数指针代表一种行为。
6. 提高性能:•在某些情况下,使用函数指针可以减少函数调用的开销,比如内联函数指针。
#include <stdio.h>
// 定义一个函数指针类型
typedef double (*CalculationFunction)(double, double);
// 函数声明
double add(double x, double y);
double subtract(double x, double y);
void calculate(double x, double y, CalculationFunction func);
// 实现加法函数
double add(double x, double y)
{
return x + y;
}
// 实现减法函数
double subtract(double x, double y)
{
return x - y;
}
// 使用函数指针来计算结果
void calculate(double x, double y, CalculationFunction func)
{
double result = func(x, y);
printf("Result: %f\n", result);
}
int main()
{
// 调用calculate函数并传入add函数指针
calculate(10, 5, add); // 输出: Result: 15.000000
// 调用calculate函数并传入subtract函数指针
calculate(10, 5, subtract); // 输出: Result: 5.000000
return 0;
}
数据库文件与普通文件区别:
1.普通文件对数据管理(增删改查)效率低
2.数据库对数据管理效率高,使用方便
常用数据库:
1.关系型数据库:
将复杂的数据结构简化为二维表格形式
大型:Oracle、DB2
中型:MySql、SQLServer
小型:Sqlite
2.非关系型数据库
以键值对存储,且结构不固定
//JSON
Redis
MongoDB
嵌入式数据库:
sqlite3:
stu.db
1.开源免费, c语言开发
2.代码量少,1万行左右,总大小10M以内
3.文件型数据库,可以移动
4.数据容量最大2T
sqlite3的安装
1.在线安装
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
2.源码安装
1.sqlite-autoconf-3080403源代码.tar.gz拷贝到Ubuntu系统Desktop目录中
2.tar -zxvf sqlite-autoconf-3080403源代码.tar.gz
3.cd sqlite-autoconf-3080403
4../configure // 生成makefile
5.make // 编译源码
6.sudo make install // 安装
1.sqlite3 操作指令
1)命令
.
2)SQL语句
增 删 改 查
2. sqlite3 API接口(应用程序接口)
增,删, 改, 查
https://www.runoob.com/sqlite/sqlite-tutorial.html
sqlite命令:
1..help
查看sqlite3支持的相关命令
2..quit
退出sqlite3数据库
3..tables
查看数据库中的所有表
4..schema tablename
查看tablename创建时的SQL语句(表的结构)
5..headers on/off
开启关闭列名称
6..mode column
以左对齐列宽显示数据
7..width 第一列宽度 第二列宽度 第三列宽度 ...
设置column模式显示下的每列的宽度
SQL语言:
1.create table
创建表
create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
sqlite3数据类型:
INTEGER : int
REAL:double float
TEXT: char 字符串
NULL:值是一个 NULL值。
表不存在,则创建,存在不创建
create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
2.insert into
插入表
INSERT INTO 表名称 VALUES(值1, 值2,....)
4.select
查表
SELECT * FROM 表名称
SELECT 列名称 FROM 表名称
SELECT 列名称1,列名称2,列名称3 FROM 表名称
5.where
1)条件匹配
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
运算符:
>
=
<
!=
and
or
2)模糊查询
SELECT * FROM 表名称 WHERE 列名 like '%冬梅';
SELECT * FROM 表名称 WHERE 列名 like '马%';
SELECT * FROM 表名称 WHERE 列名 like '马__';
百分号(%)代表零个、一个或多个数字或字符。
下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。
3)顺序显示
selete * form 表名称 order by 列名 ASC; //升序查询
selete * form 表名称 order by 列名 DESC; //降序查询
select * from class1 order by score ASC; 升序查询
select * from class1 order by score DESC;降序查询
6.delete
删除表中信息
DELETE FROM 表名称 WHERE 列名称 = 值
7.update
改表中信息
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
8.datetime
datetime('now', '+8 hours');
select datetime('now', '+8 hours');
查询当前东八区时间
insert into class3 values(1, 'zhangsan', 99, datetime('now', '+8 hours'));
insert into class3 values(2, 'lisi', 100, datetime('now', '+8 hours'));
insert into class3 values(3, 'wanger', 98, datetime('now', '+8 hours'));
10. 设置主键值自动增长列
create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);
11. drop table 表名称
删除一张表
=============================================================
数据库维护命令:
安装可视化工具
sudo apt-get install sqlitebrowser
sqlitebrowser xxx.db
Navica tSqlite3 Windows下图形操作接口
==================================================================================================================================
sqlite数据库编程:
1.编程框架
打开数据库---》读写数据库(增,删,改,查)---》关闭数据库
sqlite3.h
-lsqlite3
2.sqlite3函数接口:
1.sqlite3_open
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
功能:
打开一个数据库文件获得操作数据库文件的句柄
如果数据库存在,则打开;不存在,则创建
参数:
filename:数据库文件路径
ppDb:存放句柄指针空间的首地址
返回值:
成功返回SQLITE_OK
2.sqlite3_errmsg
const char *sqlite3_errmsg(sqlite3*);
功能:
获得出错原因
3.sqlite3_close
int sqlite3_close(sqlite3*);
功能:
关闭数据库句柄,释放空间
4.sqlite3_exec
int sqlite3_exec(
sqlite3* pDb, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
功能:
在数据库中执行SQL语句
参数:
sqlite3*:数据库句柄
sql :SQL语句字符串首地址
callback:回调函数(只有select时使用)
void * :回调函数的传参(只有select时使用)
char **errmsg:出错信息存放空间首地址
返回值:
成功返回SQLITE_OK 0
回调函数类型:
int fun(void* para,int n_column,char** column_value,char** column_name);
参数:
para : sqlite3_exec传递的第四个参数
n_column :查询到数据的列数
column_value:查询结果每个字段的首地址集合
column_name :查询结果每个字段的字段名称首地址集合
注意:
1. 回调函数查询到几行数据就执行几次;
2.回调函数必须要返回0,否则sqlite3_exec调用失败
3.数据库中查出的数据均为字符串
5.sqlite3_free
void sqlite3_free(void*);
功能:释放保存出错信息的空间