双指针功能

问题描述:

我知道这是非常基本的,但我必须理解这个概念,为什么它不起作用?双指针功能

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]'到'int * arr [N]'而不是相反。 – lurker

+0

为什么它不是一回事?那是我不明白的 –

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,具体取决于您的架构。