关于opengl:“const void * const *”在C中的含义是什么?

What does “const void * const *” mean in C?

本问题已经有最佳答案,请猛点这里访问。

我在看OpenGL中的一个函数glmultidrawElements,它将其中一个参数定义为具有这种类型:const GLvoid * const *。显然,glvoid是无效的,但我的问题是,第二个const是什么意思?它能被忽略吗?如果可以的话,有人能解释为什么会这样做。

https://www.opengl.org/sdk/docs/man4/html/glmultidrawelements.xhtml


在这个建筑中

1
const GLvoid * const *.

第二个限定符const表示指针const GLvoid *是常量指针。也就是说,它是指向GLvoid类型的const对象的常量指针。

此参数声明

1
const GLvoid * const * indices

意味着使用指针indices不能更改它指向的指针(如果该指针指向指针数组的第一个元素,则不能更改指针)。

考虑下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

void f( const char **p )
{
    p[0] ="B";
}

int main( void )
{
    const char * a[1] = {"A" };
    f( a );

    puts( a[0] );
}

此函数将成功编译,您可以更改[0]的值。

但是,如果按以下方式重写程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

void f( const char * const *p )
{
    p[0] ="B";
}

int main( void )
{
    const char * a[1] = {"A" };
    f( a );

    puts( a[0] );
}

编译器发出如下错误:

1
2
3
4
prog.c:10:10: error: read-only variable is not assignable
    p[0] ="B";
    ~~~~ ^
1 error generated.