C++ * const *const

5

我尝试搜索这个问题的答案,但很难找到‘确切’的示例。我对指向指针的概念了解甚少,感觉这里肯定有比简单指针复杂的东西存在。

那么你们会如何翻译呢?

void free(shame_1 * const * const group_1);

我如果将其翻译为const group_1指针指向const shame_1指针,是否正确?
谢谢。

3
group_1еҸӘжҳҜеҸҳйҮҸзҡ„еҗҚз§°гҖӮеӣ жӯӨпјҢиҜҘеҸҳйҮҸзҡ„зұ»еһӢдёәжҢҮеҗ‘еёёйҮҸжҢҮй’Ҳзҡ„еёёйҮҸжҢҮй’ҲпјҢжҢҮеҗ‘shame_1гҖӮиҝҷйҮҢе®ҡд№үconstnessзҡ„ж–№ејҸж„Ҹе‘ізқҖжӮЁдёҚиғҪжӣҙж”№group_1зҡ„еҖјжҲ–*group_1зҡ„еҖјпјҢдҪҶеҸҜд»Ҙжӣҙж”№**group_1зҡ„еҖјгҖӮ - jogojapan
2
如果您在阅读C/C++声明时遇到困难,请查看螺旋规则 - zakinster
我的一位同事给了我一个技巧,对我很有帮助,那就是:“从右到左读取类型”。现在我知道了这个技巧,它解决了很多困惑 :) - rozina
非常感谢大家快速、准确的回答!同时,也要感谢在本帖下面的回答,因为我不想使用回答按钮。我曾经认为这个网站对新手比较苛刻,但我错了。等我将这些信息消化后,我会贴出正确的答案。另外,我还想知道是否有一种方法可以在C#中完成这个确切的事情?如果您愿意回答,感谢您。 - matti marvi
如果你看到C语言的代码感到头痛不已,你可以随时退而求其次,使用cdeclcdecl explain 'int * const * const group_1' - mtvec
2个回答

5
shame_1 * const * const group_1;

声明一个名为group_1的变量,其类型是const指针(无法更改它指向的位置),指向另一个const指针(相同)到shame_1类型的对象,你可以实际更改其值。

因此,例如,你不能编译:

group_1 = nullptr;
*group_1 = nullptr;

然而,您可以进行以下操作:

void f(shame_1& group) {
    //stuff that modifies group
    ...
}
f(**group1);

如zakinster的评论所述,查看“螺旋规则”应该能帮助您理解这种符号表示法。 螺旋规则

3
通常,只需要从右到左阅读:
void free(shame_1 * const * const group_1);

free接受一个名为group_1的参数,它是指向shame_1对象的const指针的const指针。

  • 虽然这里并不相关,但从右往左阅读的主要麻烦在于有些人使用T const *,而其他人使用const T*,它们的意思相同,因此无论您看到T const还是const T,都应该将其视为const T。在您的代码中,仅指针是const

例如:

shame_1 a_shame;
const shame_1* p_a_shame = &a_shame;
free(&p_a_shame);

这样的操作实际上没有多大用处... free() 可以接受一个指向 shame_1const 指针而不需要额外的间接级别,并且仍然能够对 shame_1 进行所有相同的操作,因此仅在 free() 必须将指向 const-指针的指针传递给其他函数时才有用(但最终没有好的理由使用整个混乱)。

您可以将内存使用/关系可视化为:

[a_shame]  <------ [p_a_shame]  <------  [group_1]*
  • 这很可能只在CPU寄存器中,虽然其他寄存器在优化后也可能。

如果我把它翻译成const group_1指向shame_1的const指针,我是对的吗?

对我来说,“const group_1 pointer”有些可疑... 我认为“group_1是指向常量的指针”或“常量指针(称为group_1)指向...”更好理解一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接