C++ 举例说明为什么有人应该在C/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需要具有三个指
编辑:特别是我正在寻找使用三个指针的源代码 我想到的最好的例子是一个稀疏的多级表。例如,实现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
)传递给函数。