Linux内核中的variables名称之后的* const *的使用扭曲

有人可以解释下面的代码中实际定义了什么,以及最后是什么const? 是一个名为__user的variables和__argvtypes的指针__argv __user创build?

 const char __user *const __user *__argv 

我熟悉将const放置(使指针/数据不可修改)的可能性,但我从来没有想过上述的可能性。

片段来自内核中的这个函数声明:

 1593 int do_execve(const char *filename, 1594 const char __user *const __user *__argv, 1595 const char __user *const __user *__envp, 1596 struct pt_regs *regs) 

编辑:我可能不会问我曾经有关于__usermacros的问题。 尽pipe如此,它并不完全相同,因为定义variables的实际types在这里没有讨论。

实际上, __user是一个提供一些属性的宏(更多在这里 )。 所以,这个变量被命名为__argv ,它的类型指针是指向const char的const指针

const T *pT const *p声明p作为指向const T的指针。

T * const p声明为一个指向Tconst指针。

const T * const pT const * const p都将p声明为const Tconst指针。