为什么 sqlite3_open 我们使用双指针 ** 而 sqlite3_prepare 我们使用指针 *

Why is that for sqlite3_open we use double pointer ** and for sqlite3_prepare we use pointer *

不对的地方请指正

我读了这个答案 并且我的理解是因为对象可以扩展并且 运行 超出 space 然后内存位置我也 change.But 这里两种 sqlite3 语法以不同方式引用对象。为什么?

sqlite3_open 我们有:sqlite3 **ppDb

SQLITE_API int SQLITE_STDCALL sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */

对于 sqlite3_prepare 我们有:sqlite3 *db

SQLITE_API int SQLITE_STDCALL sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */

sqlite3_open 需要以某种方式给你一个数据库连接对象;即 sqlite3 对象。

为了防止人们访问内部结构,sqlite3.hsqlite3 声明为不透明结构。这意味着您不能为 sqlite3 分配 space,因为您不知道它包含什么; SQLite 库必须为您分配它并为您提供指向它的指针 (sqlite3*)。

所以现在我们有一个假设的函数sqlite3* sqlite3_open(...);,它打开一个数据库和return一个指向连接对象的指针。但是等一下;如果发生错误怎么办?我们可以 return NULL,但开发人员应该如何区分 "database doesn't exist" 错误与 "database is read only"、"database is corrupted" 或其他错误?

因此,sqlite3_open return是一个整数return代码,如果打开成功,则将连接指针写入ppDB参数指向的内存。

sqlite3_open通常这样使用:

sqlite3* myDB;
int status = sqlite3_open("/path/to/db", &myDB);
if(status != SQLITE_OK) {
    // error occured
    return;
}
// sqlite3_open wrote a database pointer to myDB, use it here
status = sqlite3_prepare_v2(myDB, "SELECT * FROM whatever", -1, NULL, NULL);
// ...