需要解释指针在作为函数args传入时如何工作

时间:2009-08-19 17:57:31

标签: c

我以为我理解了指针的基础知识,但在查看了一些关于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);

感谢您的帮助。

5 个答案:

答案 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;&databasedatabase指针的地址(或指针)。

sqlite3_open获取指向指针的指针,以便它可以设置指针指向的值。它会生成sqlite值,并将指针更改为指向它。 sqlite3_close不会改变指针指向的内容,因此所需要的只是指针本身。

答案 3 :(得分:0)

答案 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语言中,指针将起作用......