为什么要使用双重间接?或者为什么要使用指向指针的指针?

11 浏览
0 Comments

为什么要使用双重间接?或者为什么要使用指向指针的指针?

在C语言中什么时候应该使用双重间接引用?能否通过示例进行解释?

我所知道的是,双重间接引用是指指向指针的指针。为什么我需要一个指向指针的指针呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

一个原因是你想改变函数参数传递的指针的值,为此你需要一个指向指针的指针。

简单来说,当你想保留(或在函数调用外部保留更改)内存分配或赋值时,请使用 **(因此,将这样的函数传递给双重指针参数。)

这可能不是一个非常好的例子,但会向你展示基本用法:

#include 
#include 
void allocate(int **p)
{
    *p = (int *)malloc(sizeof(int));
}
int main()
{
    int *p = NULL;
    allocate(&p);
    *p = 42;
    printf("%d\n", *p);
    free(p);
}

0
0 Comments

如果你想要一个字符列表(一个单词),你可以使用char *word

如果你想要一个单词列表(一个句子),你可以使用char **sentence

如果你想要一个句子列表(一个独白),你可以使用char ***monologue

如果你想要一个独白列表(一篇传记),你可以使用char ****biography

如果你想要一个传记列表(一个生物库),你可以使用char *****biolibrary

如果你想要一个生物库列表(一个??lol),你可以使用char ******lol

... ...

是的,我知道这些可能不是最好的数据结构


带有非常非常非常无聊的lol的用法示例

#include 
#include 
#include 
int wordsinsentence(char **x) {
    int w = 0;
    while (*x) {
        w += 1;
        x++;
    }
    return w;
}
int wordsinmono(char ***x) {
    int w = 0;
    while (*x) {
        w += wordsinsentence(*x);
        x++;
    }
    return w;
}
int wordsinbio(char ****x) {
    int w = 0;
    while (*x) {
        w += wordsinmono(*x);
        x++;
    }
    return w;
}
int wordsinlib(char *****x) {
    int w = 0;
    while (*x) {
        w += wordsinbio(*x);
        x++;
    }
    return w;
}
int wordsinlol(char ******x) {
    int w = 0;
    while (*x) {
        w += wordsinlib(*x);
        x++;
    }
    return w;
}
int main(void) {
    char *word;
    char **sentence;
    char ***monologue;
    char ****biography;
    char *****biolibrary;
    char ******lol;
    //fill data structure
    word = malloc(4 * sizeof *word); // assume it worked
    strcpy(word, "foo");
    sentence = malloc(4 * sizeof *sentence); // assume it worked
    sentence[0] = word;
    sentence[1] = word;
    sentence[2] = word;
    sentence[3] = NULL;
    monologue = malloc(4 * sizeof *monologue); // assume it worked
    monologue[0] = sentence;
    monologue[1] = sentence;
    monologue[2] = sentence;
    monologue[3] = NULL;
    biography = malloc(4 * sizeof *biography); // assume it worked
    biography[0] = monologue;
    biography[1] = monologue;
    biography[2] = monologue;
    biography[3] = NULL;
    biolibrary = malloc(4 * sizeof *biolibrary); // assume it worked
    biolibrary[0] = biography;
    biolibrary[1] = biography;
    biolibrary[2] = biography;
    biolibrary[3] = NULL;
    lol = malloc(4 * sizeof *lol); // assume it worked
    lol[0] = biolibrary;
    lol[1] = biolibrary;
    lol[2] = biolibrary;
    lol[3] = NULL;
    printf("total words in my lol: %d\n", wordsinlol(lol));
    free(lol);
    free(biolibrary);
    free(biography);
    free(monologue);
    free(sentence);
    free(word);
}

输出:

我的lol中的总单词数:243
0