C++ 举例说明为什么有人应该在C/C++;?

C++ 举例说明为什么有人应该在C/C++;?,c++,c,C++,C,我正在寻找一个例子或解释,为什么有人应该在C/C++中使用或不使用三重指针。有没有出现三重指针的源代码 提前谢谢 编辑:特别是我正在寻找使用三个指针的源代码 我想到的最好的例子是一个稀疏的多级表。例如,实现Unicode字符属性的一种方法可能是: prop_type ***proptable; ... prop_type prop = proptable[c>>14][c>>7&0x7f][c&0x7f]; 在这种情况下,proptable需要具有三个指

我正在寻找一个例子或解释,为什么有人应该在C/C++中使用不使用三重指针。有没有出现三重指针的源代码

提前谢谢


编辑:特别是我正在寻找使用三个指针的源代码

我想到的最好的例子是一个稀疏的多级表。例如,实现Unicode字符属性的一种方法可能是:

prop_type ***proptable;
...
prop_type prop = proptable[c>>14][c>>7&0x7f][c&0x7f];
在这种情况下,
proptable
需要具有三个指针类型(如果最终生成的类型是指针类型,则可能具有四个指针)。将其作为多个级别而不是一个平面表进行此操作的原因是,在第一级和第二级,当内容都相同时(例如,巨大的CJK范围),多个条目可以指向同一个子表

这里是我实现的另一个多级表示例;我不能说我对设计感到非常自豪,但考虑到代码必须满足的约束条件,它是最不糟糕的实现选择之一:


如果使用链表,则必须存储列表第一个元素的地址
(第一个指针)

如果需要在该列表中进行更改,则需要另一个指针
(双指针)

如果需要在两个指针中传递正在更改的列表,并在另一个函数中更改它,则需要另一个指针
(三个指针)


它们有很多示例

一个非常简单的示例是指向数组数组的指针。

如果需要通过函数参数返回指向可变长度字符串的指针数组:

int array_of_strings(int *num_strings, char ***string_data)
{
    int n = 32;
    char **pointers = malloc(n * sizeof(*pointers));
    if (pointers == 0)
        return -1;  // Failure
    char line[256];
    int i;
    for (i = 0; i < n && fgets(line, sizeof(line), stdin) != 0; i++)
    {
        size_t len = strlen(line);
        if (line[len-1] == '\n')
            line[len-1] = '\0';
        pointers[i] = strdup(line);
        if (pointers[i] == 0)
        {
            // Release already allocated resources
            for (int j = 0; j < i; j++)
                free(pointers[j]);
            free(pointers);
            return -1;  // Failure
        }
    }
    *num_strings = i;
    *string_data = pointers;
    return 0;  // Success
}
int数组(int*num字符串,字符***字符串数据)
{
int n=32;
字符**指针=malloc(n*sizeof(*指针));
if(指针==0)
返回-1;//失败
字符行[256];
int i;
对于(i=0;i

编译代码。

我在C++中使用了三个指针:

有一个为Java程序编写的接口:

它需要一个字符串数组

typedef void (*_SMARTPluginInit)(SMARTInfo *ptr, bool *replace, int *buttonc, char ***buttonv, int **buttonid, _SMARTButtonPressed *buttonproc);
然后在我的程序中,我会:

char* btnTexts[2] = {"Disable OpenGL_Enable OpenGL", "Enable Debug_Disable glDebug"}; //array of C-style strings.

void SMARTPluginInit(SMARTInfo* ptr, bool* ReplaceButtons, int* ButtonCount, char*** ButtonTexts, int** ButtonIDs, _SMARTButtonPressed* ButtonCallback)
{
    *ButtonText = btnTexts; //return an array of strings.
}
<>但是在C++中,可以使用引用而不是指针,它会变成:

void SMARTPluginInit(SMARTInfo* ptr, bool* ReplaceButtons, int* ButtonCount, char** &ButtonTexts, int** ButtonIDs, _SMARTButtonPressed* ButtonCallback)
{
    ButtonText = btnTexts; //return an array of strings.
}
现在请注意,“ButtonTexts”现在是对C样式字符串数组的引用


char***
可以是指向C样式字符串数组的指针,这是您使用它的一次。

三重指针是一个指针变量,指向一个指针,而该指针又指向另一个指针。这种复杂编程技术的使用通常是公司一次处理成吨的数据。单个指针将指向单个数据块(假设在一个大文件中),使用三个指针将导致处理速度比不同数据块(在同一文件中)快3倍可以由不同的指针指向,因此可以更快地访问/处理数据(不像一个指针遍历整个文件)。

这就是你成为一名程序员的原因。我根本不想成为“三星级程序员”。)我很想发布“当你不理解抽象的概念时”作为回答,但我想现在我不会。当你想编写一个修改
**
的函数时。在C语言中,如果没有引用,你还需要一层指针。一个更好的问题是:一个为什么不应该使用三重指针的例子…那不是三重指针。那只是一个3d阵列。对于锯齿状的3d数组,您只需要三个指针。@VoidStar:不,使用3d数组会破坏整个目的,并使其等效于平面数组。关键词是稀疏。我更新了我的答案以澄清问题。如果它是一个3d阵列,它将需要使用总共
68*128*128*sizeof***proptable
字节的存储空间,这是巨大的。实际上,这样的多级表可以容纳数kb.Thx,例如:)公平地说,@VoidStar,在发布第一条注释时,我的答案不太清楚。请注意,释放指针的for循环和指针数组应提取到单独的函数中,并在错误处理的清理路径中使用,在使用字符串数组完成后,在调用函数中使用。将初始化指针的数量(错误恢复代码中的
i
)和指针(代码中的变量
pointers
)传递给函数。