Он ведет себя, как и ожидалось:
#include <stdio.h>
int main(int argC,char* argV[])
{
int marks[4][2]={0};
printf("%x %x %x\n"
"%x %x %x\n"
"%x %x\n",
marks,marks[0],marks[0][0],
*marks,&marks,**marks,
&marks[0],&marks[0][0]);
return 0;
}
Имеет вывод:
12ff44 12ff44 0
12ff44 12ff44 0
12ff44 12ff44
Все указатели на первый элемент списка (кроме нуля, который равен первый элемент списка).