我以为我理解了指针的基础知识,但在查看了一些关于sqlite3方法的文档后,我被抛出了,所以现在我不确定我的理解是否正确。
这是对sqlite3方法的调用:
char* dataFilePath = "foobar.sqlite";
if (sqlite3_open(dataFilePath, &database) != SQLITE_OK) {...}
这是函数头声明:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
为什么&数据库突然成为指针的指针?
关闭数据库连接的另一个方法调用是: sqlite3_close(数据库);
在函数头中有以下内容:
int sqlite3_close(sqlite3 *);
当我传入指针时,为什么这只是一个指针?这不是指向指针的指针吗?
从我看到的所有例子中,它似乎总是与上述函数相反,即
// function
void foo(someDataType *bar) { ... }
// function call
foo(&bar);
感谢您的帮助。
答案 0 :(得分:15)
最有可能的是,sqlite3_open
正在为数据库句柄分配内存。因此,该函数需要一个指向数据库句柄(sqlite3
)的 指针 ,以便它可以修改 指针< / em> 到数据库句柄。例如:
typedef struct { /*...*/ } sqlite3;
int sqlite3_open(const char *filename, sqlite3 **ppDb) {
/* ... */
// Allocate memory for the database handle.
*ppDb = (sqlite3 *)malloc(sizeof(sqlite3));
/* ... */
return 0;
}
但是,sqlite3_close
只需要一个指向free
内存的指针:
int sqlite3_close(sqlite3 *pDb) {
/* ... Cleanup stuff ... */
free(pDb);
return 0;
}
答案 1 :(得分:5)
我认为您所要求的简短解释是使用“&amp;”本质上意味着“指向这个”的指针
int value = 0;
int *pointer = &value;
int **doublePointer = &pointer;
答案 2 :(得分:4)
指针是变量的地址。
假设database
被声明为sqlite3* database;
,&database
是database
指针的地址(或指针)。
sqlite3_open
获取指向指针的指针,以便它可以设置指针指向的值。它会生成sqlite
值,并将指针更改为指向它。 sqlite3_close
不会改变指针指向的内容,因此所需要的只是指针本身。
答案 3 :(得分:0)
与往常一样,C FAQ列表包含相关信息。请参阅I have a function which accepts, and is supposed to initialize, a pointer:和Does C even have "pass by reference"?。
答案 4 :(得分:0)
我不知道你想用sqlite函数做什么。但是使用指针可以让你保持功能的变化。
将变量传递给函数时,变量将被复制。
例如
int var1=0;
in *ptr1=&var1;
func(var1, ptr1);
var1 = 5的值
var1的地址= 0xff2200(类似的东西)
ptr1 = 0xff2200(var1的地址)的值
ptr1的地址= 0xff0022(不同的东西)
让我们编写一个使用这两个var作为arg
的函数void func1(int x, int *p){
x+=5;
(*p)-=5;
}
使用此功能后;
func(var1, ptr1);
var1不等于0 !!! İt将是-5
由于; 在函数func1
中x = 0(var1的值)
的值x = 0xaabbcc的地址(不同于var1 !!!这就是为什么x + = 5对var1无效。它发生在内存的另一部分!当你返回时,这个内存将再次被释放。而你会失去你的改变......)
p = 0xcccccc的地址(也有所不同)
p = 0xff2200的值(ptr1的值和var1的地址!此操作将在var1的地址中完成,因此您不会丢失更改)
如果我们必须保持变量-in functions-的更改,我们必须使用指针来查找var。 如果我们的变量保留地址,则意味着;它是一个指针。如果我们想要保持指针-in函数的更改,那么我们必须使用指针指针。
这是我的第一条消息,我希望这会有所帮助...
“通过引用传递”意味着“通过指针传递”其他语言不使用指针。所以你有时候必须通过参考。但在C语言中,指针将起作用......