Что обозначает двойная звездочка в C и почему функция возвращает значение не ссылкой а числом (return 1 return 0)?

DIR ** это указатель на указатель на DIR. Он затем разыменовывается и получается указатель на DIR.
Почему возвращает число - видимо так надо было разработчикам lua. Можешь попробовать погуглить эту тему.
P.s. в СИ нет ссылок, только указатели. А вот в С++ если и ссылки и указатели.
Вот как раз число очень просто, так как 0 всегда ОК было в си, а отличие от него есть номер какой-то ошибки.
А вот по поводу подобного DIR **d = (DIR **)lua_newuserdata(L, sizeof(DIR *));
скажу так, если вы имеет просто указатель type *u то для возможности изменения его где-то не достаточно просто передать в виде
type *u;
f(type *x) // f(u)
{
x = y;
}
так как при выходе из функции f вы не измените указатель u
Так что приходится передавать
type *u;
f(type **x) // f(&u)
{
*x = y;
}
и при выходе из функции все заменится.
Вот общая идея, зачем нужны ** в си...все так запутано в этой адресной арифметике, что ну её.
Соответствует нулю или более символов в нескольких сегментах. Он используется для подстановки файлов, находящихся во вложенных каталогах.