2010-04-03 42 views
2

我很困惑,当我想采取单指针,什么时候应该采取双指针? 在以下结构中究竟做了什么?为什么我们在Objective-C或C语言中使用双指针和三指针?

struct objc_class { 
    Class isa; 
    Class super_class; 
    const char *name; 
    long version; 
    long info; 
    long instance_size; 
    struct objc_ivar_list *ivars; 
    struct objc_method_list **methodLists; 
    struct objc_cache *cache; 
    struct objc_protocol_list *protocols; 
}; 

为什么我们使用“** methodLists”双指针。

编辑 INT sqlite3_get_table( 的sqlite3 *分贝,
为const char * ZSQL,
焦炭*** pazResult,
INT * pnRow,
INT * pnColumn,
字符** pzErrmsg
); 在上面的场景中,三指针char *** pazResult的含义是什么?

回答

6

那么,至少在C中,双指针通常用于二维数组。最常见的二维数组可能是一串C字符串(char*'s)。双指针有时也用于通过引用将指针传递给函数,但这不太可能在您发布的代码示例中使用。根据名称methodLists我想这是一个列表的数组。 C中的(链接)列表通常由指向节点的指针表示,其可以是objc_method_list。然后用双指针实现这样的列表的数组。

2

在最一般情况下,双指针是指向指针列表的指针。

4

这可能不是你所引用的代码的情况下,但你也需要一个双指针你想要的任何时间传递一个指向函数的指针,并将该指针的更改反映在该函数的范围之外。

例如,如果你试图改写strcpy函数,使用户没有分配的源字符串的内存,你可以尝试类似以下内容:

void MyStrcpy(char* dst, char* src){ 
    dst = (char*)malloc(sizeof(char)*(strlen(src)+1)); 
    for(int i=0;i<=strlen(src);i++) 
    dst[i] = src[i]; 
    printf("src: %s ", src); 
    printf("dst: %s\n\n", dst); 
} 

如果你是那么调用该函数,

int main() { 
    char *foo = "foo"; 
    char *newPtr; 

    MyStrcpy(newPtr, foo); 

    printf("foo: %s ", foo); 
    printf("new: %s\n", newPtr); 
} 

你的输出将如下所示:

源:富 DST:FOO

富:富 新:

您也可以尝试打印NEWPTR,这取决于你的系统时,得到赛格故障。这种行为的原因与您不希望更改通过值传递给函数以反映到该函数之外的int的原因完全相同:传递给MyStrcpy的内容仅仅是内存地址newPtr引用。当你在函数内部为malloc添加dst的空间时,你正在改变dst指向的地址。此更改不会反映在MyStrcpy范围之外!如果你想让newPtr指向新分配的内存块,你需要让dst成为一个指向char **的指针。现在

void MyStrcpy(char** dst, char* src){ 
    *dst = (char*)malloc(sizeof(char)*(strlen(src)+1)); 
    for(int i=0;i<=strlen(src);i++) 
    (*dst)[i] = src[i]; 
    printf("src: %s ", src); 
    printf("dst: %s\n\n", *dst); 
} 

,如果你要调用该函数:

int main() { 
    char *foo = "foo"; 
    char *newPtr; 

    MyStrcpy(&newPtr, foo); 

    printf("foo: %s ", foo); 
    printf("new: %s\n", newPtr); 
} 

你会得到你的预期输出:

源:富 DST:富

富:富 新:foo

希望有所帮助!