2016-01-21 76 views
-3

這裏路過2維陣列成一個函數是我的代碼(幻方)的示例:使用指針Ç

int magicsqr(int *magic,int size); 
    int main() 
    { 
     int size,*ptr; 
     char stop; 
     repeat: 
     printf("Please Enter an Odd number for the magic square(3 or greater):\n"); 
     scanf("%d",&size); 
     fflush(stdin); 
     ptr=(int*)calloc(size*size,sizeof(int)); 
     while((size%2==0)||(size<=1)) 
     { 
      printf("U entered a wrong number.\n"); 
      repeat1: 
      printf("Do you wish to continue?(Y or N)\n"); 
      scanf("%c",&stop); 
      fflush(stdin); 
      if(stop=='Y'||stop=='y') 
       goto repeat; 
      else if(stop=='N'||stop=='n') 
       printf("Thanks for trying our beta program.\n"); 
      else 
      { 
       printf("U entered a wrong character.\n"); 
       goto repeat1; 
      } 
     } 
     magicsqr(ptr,size); 
     return 0; 
    } 
    int magicsqr(int *magic,int size) 
    { 
     int i,j,num; 
     i=1; 
     j=(size+1)/2; 
     for(num=1;num<=size*size;num++) 
     { 
      *(magic+i*size+j)=num; 
      if(num%size==0){ 
       i++; 
       continue; 
       } 
      if(i==1) 
       i=size; 
      else 
       i--; 
      if(j==size) 
       j=1; 
      else 
       j++; 
     } 
     for(i=1;i<=size;i++) 
     { 
      printf("\n"); 
      for(j=1;j<=size;j++) 
       printf("%d\t",*(magic+i*size+j)); 
     } 
} 

所以我得到了困惑我幾個問題..

1-至於因爲我知道Arr[i][j]==*(Arr[i]+j) 所以爲什麼只有這個作品:*(magic+i*size+j)

2-我讀了很多將2維數組傳遞給使用指針的函數,但不知何故,我仍然感到困惑,如何在此代碼中表示2D數組或更多。

3-我仍然是編程的初學者,所以我希望你能解釋一點。

  • 非常感謝很多人,最後我得到了它使用指針指針和數組指針。
+1

1.從代碼中刪除I/O代碼,只留下重要部分。 2。澄清你的期望和你實際得到的結果 – michaldo

+0

我的代碼運行良好並且打印結果正確,但是我需要一些解釋,我不知道它爲什麼會像這樣工作 –

+0

代碼中沒有2D數組。 'fflush(stdin)'是未定義的行爲。 – Olaf

回答

0

1-屁股據我所知,編曲[i] [j] == *(ARR [I] + J),所以爲什麼只有這個作品: (魔+ isize + J)。

callocDon't cast result當溜溜正在做

ptr = calloc(size*size,sizeof(int)); 

它分配一維數組(或ptr是一維數組的指針),以便(magic+isize+j)這是工作。它只是將2D索引轉換爲1D來訪問數組。

2-我順便2維陣列成使用 指針的功能讀了很多,但不知我仍然困惑,如何表示一個二維數組 或多個在此代碼。

對於通過2維陣列成一個函數對correct way of passing 2D array.

0

這不是一個2D陣列在所有的外觀,但一個一個維陣列,其被用於模仿的2D陣列。

因此,存儲器分配是

ptr=calloc(size*size,sizeof(int)); 

這是爲(size * size)元件

的一維數組的數據被用於這個數組這樣

*(magic+i*size+j)=num; 

每個元件位置來訪問的分配通過加入no of rows * i + j從基準指數計算。

這些被稱爲平面陣列。

+0

現在我明白了但如果希望將其更改爲2D,我該怎麼辦? –

+0

有很多事情需要改變。 ptr的聲明,內存分配,函數調用,函數聲明和函數體將不得不被修改爲接受2D數組而不是1D數組。之後,您需要重新編譯它並查看是否需要進行其他更改。如果代碼正常工作,我認爲這不值得。 –

+0

非常感謝,你的代碼工作,但我只是測試不同的方法,以獲得更多的理解 –

0

終於明白了,感謝您的幫助。

int main() 
{ 
char stop; 
int i,j,size,num; 
repeat: 
printf("Please Enter an Odd number for the magic square(3 or greater):\n"); 
scanf("%d",&size); 
fflush(stdin); 
int **magic=(int**)malloc(size*sizeof(int*)); //size = row 
if((size%2==0)||(size<=1)) 
{ 
    printf("U entered a wrong number.\n"); 
    repeat1: 
    printf("Do you wish to continue?(Y or N)\n"); 
    scanf("%c",&stop); 
    fflush(stdin); 
    if(stop=='Y'||stop=='y') 
     goto repeat; 
    else if(stop=='N'||stop=='n') 
     printf("Thanks for trying our beta program.\n"); 
    else 
    { 
     printf("U entered a wrong character.\n"); 
     goto repeat1; 
    } 
} 

for(i=0;i<size;i++) 
    magic[i]=(int*)calloc(size,sizeof(int)); 
for(i=0;i<size;i++) 
{ 
    printf("\n"); 
    for(j=0;j<size;j++) 
     printf("%d\t",*(magic[i]+j)); 
} 
i=0; 
j=(size)/2;; 
for(num=1;num<=size*size;num++) 
{ 
    magic[i][j]=num; 
    if(num%size==0){ 
     i++; 
     continue; 
     } 
    if(i==0) 
     i=size-1; 
    else 
     i--; 
    if(j==size-1) 
     j=0; 
    else 
     j++; 
} 
for(i=0;i<size;i++) 
{ 
    printf("\n"); 
    for(j=0;j<size;j++) 
     printf("%d\t",*(magic[i]+j)); 
} 
return 0; 
}