2015-11-07 3 views
0

Я знаю, что это очень простой, но я ДОЛЖЕН понять концепцию, почему она не работает?Двойной указатель на функцию

void printMat(int arr[N][N], int n) 
{ 
    int i, j; 
    for (i = 0; i < n; i++) 
     for (j = 0; j < n; j++) 
      if (i < j) 
      { 
       arr[i][j] = 0; 
      } 

      { 
       arr[i][j] = i+j+2; 
      } 

} 

int** triDown(int arr[N][N], int n) 
{ 
    int i, j, **a; 
    for(i = 0; i < n; i++) 
    { 
     *(a+i) = (int*)malloc(sizeof(int)*(i+1)); 
    } 

    for(i=0;i<n;i++) 
     for(j=0;j<i+1;j++) 
     { 
      a[i][j] = arr[i][j]; 
     } 
    return a; 
} 

void main() 

{ 
    int *arr[N],**NewMat; 

    printMat(arr,N); 
    NewMat = triDown(arr,N); 
} 

Я действительно трудное время, пытаясь понять вещь указатель на указатель, когда речь идет о функциях и динамического распределения. Что должно было быть сделано в NewMat func?

+1

любое сообщение об ошибке, которое вы получаете? –

+3

Речь идет не о двойном указателе на функцию, а двойном указателе (или действительно указателе на указатель) на 'int'. Кроме того, типы 'int arr [N] [N]' и 'int * arr [N]' * не * то же самое в C. Вам нужно сделать их согласованными или, по крайней мере, вы можете передать 'int arr [N ] [N] 'to' int * arr [N] ', но не наоборот. – lurker

+0

Почему его не то же самое? вот что я не понимаю –

ответ

1

int a[N][N] и int *a[N] не совместимы. Первый - это двумерный массив значений int, а второй - одномерный массив указателей int. Вы должны объявить его как int (*a)[N] для совместимого типа указателя. Тогда вы можете передать ему int a[N][N] в качестве аргумента, как и в одномерном случае, когда вы передаете int a[N] на номер int *a.

Но вам нужно объявить фактический массив в main, а не только указатель на него. Обратите внимание: int (*a)[N] - это только одно значение указателя, поэтому его размер, скорее всего, будет 4 или 8 в зависимости от вашей архитектуры.