2016-01-21 3 views
-3

Вот пример моего кода (магический квадрат):Передача 2 двумерный массив в функцию с помощью указателя C

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. Извлеките код ввода/вывода из кода и оставьте только важную часть. 2.Уточняйте, что вы ожидаете, и что вы получаете на самом деле. – michaldo

+0

. Мой код хорошо работает и печатает результат правильно, но мне нужно какое-то объяснение в моем коде, что я не знаю, почему он так работал. –

+0

В вашем коде нет 2D-массива. И 'fflush (stdin)' - неопределенное поведение. – Olaf

ответ

0

1- Ass Насколько я знаю, приб [я] [J] == * (Arr [я] + J), так почему только это работает: (магия + ISize + J).

Don't cast result из calloc когда йо делают

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

Это выделение 1D массив (или ptr является 1D указатель массива), так (magic+isize+j) это работает. это просто преобразование 2D-индекса в 1D для доступа к массиву.

2- я много читал мимоходом 2 двумерный массив в функцию, используя указатели, но как-то я до сих пор путают, как представить 2D массив или больше в этом коде.

Для прохождения 2 двумерный массив в функцию имеют вид на correct way of passing 2D array.

0

Это не является 2D массив на всех, но один одномерный массив, который используется для имитации 2D массива.

Таким образом, распределение памяти

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

Это происходит выделение для 1D массив (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; 
} 
Смежные вопросы