【问题标题】:Why we used double and triple pointer in objective-C or C language?为什么我们在 Objective-C 或 C 语言中使用双指针和三指针?
【发布时间】:2010-04-03 06:23:23
【问题描述】:

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

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 *db,         
      const char *zSql,    
      char ***pazResult,   
      int *pnRow,          
      int *pnColumn,       
      char **pzErrmsg      
    );

在上述场景中,三重指针char ***pazResult 的含义是什么?

【问题讨论】:

    标签: iphone c objective-c


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在您引用的代码中可能不是这种情况,但您也需要一个双指针,只要您想将一个指针传递给一个函数并将对该指针的更改反映在该函数的范围之外。

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

      你会得到预期的输出:

      源代码:foo dst: foo

      富:富 新:foo

      希望有帮助!

      【讨论】:

        【解决方案3】:
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          一般来说,指针用来保存另一个变量的地址。如果我们需要保存指针的地址怎么办,在这种情况下我们使用双指针。当我们想要保存双指针的地址时,我们使用三指针。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-10
            • 2019-03-19
            • 2013-06-27
            • 1970-01-01
            • 1970-01-01
            • 2019-02-16
            相关资源
            最近更新 更多