2010-09-10 4 views
0

Мне нужно распечатать матрицу 3 на 3 в C. Я мог придумать три разных способа сделать это. Все ли они одинаково оптимальны или один метод лучше другого?Сравнение методов ссылки массива

Функция 1: Переходя к 2darray, используя индексы массивов

void printMatrix(int m[][3]) 
{ 
int i,j; 

for(i=0;i<3;i++) 
{ 
    for(j=0;j<3;j++) 
    { 
    printf("%d\t",m[i][j]); 
    } 
    printf("\n"); 
} 
} 

Функция 2: Передача указателя ДВМ, используя PTR арифметической

void printMatrix(int **m) 
{ 
int i,j; 

for(i=0;i<3;i++) 
{ 
    for(j=0;j<3;j++) 
    { 
    printf("%d\t", *(*(m+i)+j)); 
    } 
    printf("\n"); 
} 
} 

Функция 3: пропускания dbl, используя арифметику ptr (еще раз)

void printMatrix(int **m) 
{ 
int i,j; 

for(i=0;i<3;i++) 
{ 
    for(j=0;j<3;j++) 
    { 
    printf("%d\t",**m); 
    (*m)++; 
    } 
    (*m)=(*m)-3; 
    m++; 
    printf("\n"); 
} 
} 

ответ

2

Функция 1 работает на другом типе данных, чем функций 2 и 3.

Для функции 1, данные должны быть определены как int foo[3][3] или выделено в виде блока 9 Интс. С C89 второй 3 должен быть константой времени компиляции, что может быть проблематичным. Это можно было бы проработать, пропустив простой int * и индексируя с помощью matrix[i * dim2 + j]. Если у вас есть C99, вы можете использовать массивы переменной длины и измененные типы, чтобы сохранить красивую нотацию matrix[i][j], но декларации могут быть немного сложнее и есть некоторые ограничения.

Функции 2 и 3 работают с несколькими частями данных: массив целых указателей, которые указывают на дополнительные массивы целых чисел. Дополнительная косвенность может позволить некоторую простоту использования и гибкость (например, треугольную матрицу), но может снизить производительность.

Выбор между функциями 2 и функцией 3 довольно ясен: используйте функцию 2. Следует избегать изменения структуры данных для того, что должно быть доступно только для чтения, даже если вы вернетесь туда был: он предотвращает одновременное использование, и вы можете неправильно выполнить «вернуть его», что затрудняет диагностику проблем. Выражение *(*(m+i)+j) может быть изменено на m[i][j], хотя оно делает что-то другое.

1

Все они почти одинаковы внутри. Массивы по сути являются указателями с смещениями. Лично я считаю, что первое легче читать, поэтому я буду придерживаться этого.

+1

+1 - оптимизируйте для readabilty _first_. Любой достойный компилятор будет определять лучший способ для вас на этом уровне микроуровни. Лучшая отдача от инвестиций будет достигнута на макроуровне (выбор алгоритма и т. Д.). – paxdiablo

0

Это не имеет значения! :-)

Действительно! Лучший метод - тот, который вам больше нравится.

Смежные вопросы