2d array vs estructura de un array

Soy nuevo en el lenguaje C, por lo que mi pregunta puede no cumplir con altos estándares

podemos usar

struct mat{ int a[10]; };m[10]; 

en lugar de

 int mat[10][10]; 

¿cual es la diferencia? y cual es mas eficiente?

Deberías confiar en el comstackdor con eso. Sin embargo, puedo sugerir 2 alternativas que sé que funcionan bien dependiendo de su aplicación.

1) use int a [10] [10] pero asegúrese de acceder a ellos en el orden correcto cuando realice el bucle. El comstackdor “debajo” usará una estructura de matriz única para que acceda en orden

  for( i = 0 ; i < 10 ; i++) { for (j = 0 ; j < 10 ; j++) { // do something with a[i][j] } } 

vs

  for( i = 0 ; i < 10 ; i++) { for (j = 0 ; j < 10 ; j++) { // do something with a[j][i] } } 

Es diferente en términos de rendimiento. Cuanto más tarde es más performante.

2) La opción 1 requiere un cuidado especial y es contraintuitiva. Prefiero mucho hacer

  int a[100] 

y hacer

  for( i = 0 ; i < 100 ; i++) inline_function(a[i]); 

donde la función debe ser declarada en línea y preforma lo que tienes que haber hecho. Si puedes evitar la función, es aún mejor. Por ejemplo, si es una sum, tenerla en 2d o vector no cambia nada.

EDITAR: aquí hay una referencia que explica en los detalles el bit sobre el orden de la matriz: http://www.cplusplus.com/doc/tutorial/arrays/

Tendría m[x].a[y] que es una syntax más complicada que m[x][y] pero no agrega nada léxicamente

No. Esta es una estructura que contiene una matriz.

 struct mat { int a[10]; }; 

Puede definir una matriz de estructura:

 struct mat m[10]; 

Para hacerlo en un solo paso:

 struct mat{ int a[10]; }m[10]; 

Tenga en cuenta que tiene un punto y coma adicional antes de m [10] que no es la syntax correcta.

Para acceder a un elemento en arr, use m[i].a[j]

Esto no es equivalente en syntax a una matriz 2d como:

 int mat[10][10]; 

al cual puede acceder usando mat[i][j]