2d массив против структуры массива

Я новичок в языке C, поэтому мой вопрос может не соответствовать высоким стандартам

мы можем использовать

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

вместо

 int mat[10][10]; 

какая разница? и что более эффективно?

Вы должны доверять этому компилятору. Однако я могу предложить 2 альтернативы, которые, как я знаю, хорошо работают в зависимости от вашего приложения.

1) используйте int a [10] [10], но убедитесь, что вы обращаетесь к ним в правильном порядке при циклировании. Компилятор будет «под» использовать единую структуру массива так, чтобы она была в порядке

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

против

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

отличается с точки зрения производительности. Позже он более совершенен.

2) Вариант 1 требует особой осторожности и противоречит интуиции. Я предпочитаю делать

  int a[100] 

и делать

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

где функция должна быть объявлена ​​встроенной и заготовкой того, что вы должны были сделать. Если вы можете избежать функции, это еще лучше. Например, если это сумма, наличие 2d или вектора ничего не меняет.

EDIT: вот ссылка, которая объясняет в деталях бит о порядке массива: http://www.cplusplus.com/doc/tutorial/arrays/

У вас будет m[x].a[y] который является более сложным синтаксисом, чем m[x][y] но не добавляет ничего лексически

Нет. Это структура, содержащая массив.

 struct mat { int a[10]; }; 

Вы можете определить массив struct:

 struct mat m[10]; 

Чтобы сделать это за один шаг:

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

Обратите внимание, что у вас есть дополнительная точка с запятой до m [10], которая не является правильным синтаксисом.

Чтобы получить доступ к элементу в arr, вы используете m[i].a[j]

Это не эквивалентно синтаксису для массива 2d, например:

 int mat[10][10]; 

к которым вы можете получить доступ, используя mat[i][j]