代码之家  ›  专栏  ›  技术社区  ›  Tirth

为什么我们在目标C或C语言中使用双指针和三指针?

  •  2
  • Tirth  · 技术社区  · 14 年前

    我搞不清楚什么时候我想用单指针,什么时候应该用双指针? 在下面的结构中,究竟做了什么?

    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_表( sqlite3*数据库,
    常量char*zsql,
    字符***pazresult,
    国际*PNROW,
    int*pn列,
    字符**pzerrmsg
    ; 在上面的场景中,三指针char***pazresult的含义是什么?

    4 回复  |  直到 14 年前
        1
  •  6
  •   Eli Bendersky    14 年前

    至少在C语言中,双指针通常用于二维数组。最常见的二维数组可能是C字符串数组( char* s)。有时也使用双指针向函数传递指针 参考 但这不太可能在您发布的代码示例中使用。

    根据名字 methodLists 我想这是一组列表。C语言中的(链接的)列表通常由指向节点的指针表示,该节点 objc_method_list 可以是。然后使用双指针实现这样的列表数组。

        2
  •  4
  •   Jordan Wills    14 年前

    在您引用的代码中可能不是这样,但是在任何时候您想要传递一个指向函数的指针并且对该指针所做的更改反映在该函数的作用域之外时,都需要一个双指针。

    例如,如果您试图重写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);
    }
    

    您的输出如下:

    来源:foo 夏令时:foo

    foo:foo 新的:

    在尝试打印newptr时,也可能会出现SEG错误,这取决于您的系统。这种行为的原因与您不希望更改通过值传递给函数的int的原因完全相同:传递给mystrcpy的只是newptr引用的内存地址。当您在函数内为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);
    }
    

    您将获得预期的输出:

    来源:foo 夏令时:foo

    foo:foo 新:foo

    希望有帮助!

        4
  •  2
  •   thelsdj    14 年前

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