C语言中“const void * const *”是什么意思?

sma*_*007 2 c opengl pointers constants

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

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

Vla*_*cow 6

在本次施工中

const GLvoid * const *.
Run Code Online (Sandbox Code Playgroud)

第二个限定符const意味着该指针const GLvoid *是一个 const 指针。也就是说,它是一个常量指针,指向类型为 const 的对象GLvoid

该参数声明

const GLvoid * const * indices
Run Code Online (Sandbox Code Playgroud)

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

考虑下面的例子

#include <stdio.h>

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

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

    puts( a[0] );
}    
Run Code Online (Sandbox Code Playgroud)

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

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

#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] );
}    
Run Code Online (Sandbox Code Playgroud)

编译器会发出类似的错误

prog.c:10:10: error: read-only variable is not assignable
    p[0] = "B";
    ~~~~ ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)