Четыре приведенные ниже программы вводят двумерный массив, а затем распечатывают его.
- Первый выводит мусорные значения, а также выдает несколько предупреждений (чего я не понял).
- Второй работает правильно, и это имеет смысл, поскольку я считал, что 2D-массив хранится в памяти линейно.
- Третий работает правильно, но я понятия не имею, почему он работает.
4-й тоже работает.
Так что было бы очень полезно, если бы кто-нибудь мог объяснить, как работает каждый из методов, ура
Боюсь, мое понимание того, как работают указатели, не так хорошо, как я думал.
int main(){
int n;
int a [3][4];
int i=0,j=0,count=0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",(a+4*i+j)); // Output-514623632 514623648 514623664 514623680 514623696 514623712 514623728 514623744 514623760 514623776 514623792 514623808
}
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d\t",*(a+4*i+j));
}
}
return 0;
}
Warnings -solution.c:15:21: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int (*)[4]’ [-Wformat=]
scanf("%d",(a+4*i+j));
solution.c:20:22: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("%d\t",*(a+4*i+j));
~^ ~~~~~~~~~
%ls
int main(){
int n;
int a [3][4];
int i=0,j=0,count=0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",*(a+4*i+j));
}
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d\t",**(a+4*i+j)); // Output -1 2 3 4 5 6 7 8 9 10 11 12
}
}
return 0;
}
int main(){
int n;
int a [3][4];
int i=0,j=0,count=0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
scanf("%d",(*(a+i)+j));
}
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d\t",*(*(a+i)+j)); // Output- 1 2 3 4 5 6 7 8 9 10 11 12
}
}
return 0;
}
int main(){
int n;
int * a=(int*)malloc(12*sizeof(int)) ;
int i=0,j=0,count=0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
*(a+4*i+j)=++count;
}
}
for(i=0;i<3;i++){
for(j=0;j<4;j++){
printf("%d\n",*(a+4*i+j)); // Output- 1 2 3 4 5 6 7 8 9 10 11 12
}
}
return 0;
}
[]
. Я понимаю, что хочу сделать это в качестве учебного упражнения, но на практике вашему коду будет намного легче следовать (и у вас будет меньше шансов совершить ошибку), если вы просто напишетеa[i][j]
. - person John Bode   schedule 29.09.2017