#arrays #c #function #multidimensional-array
#массивы #c #функция #многомерный массив
Вопрос:
Приветствия дня
Я новичок в C.
Я изучаю C.
Я решаю проблему с 2d-массивом.
Проблема в том, что я должен брать значения многомерного массива и печатать их.
И способ печати должен быть таким :
2 3
4 5
6 7
/*
Array is like-
{
{2,3},
{4,5},
{6,7}
}
*/
Итак, я думаю, проблема вам понятна.
Мой код выдает мне много ошибок
#include <stdio.h>
void display(int ptr[] ,int n,int nt);
int main(){
int arr[3][2];
for(int i=0 ; i<3 ; i ){
for(int j=0 ; j<2 ; j ){
scanf("%d", amp;arr[i][j]);
}
}
display(arr,3,2);
return 0;
}
void display(int ptr[],int n,int nt){
for(int i=0 ; i<n ; i ){
for(int j=0 ; j<nt ; j ){
printf("%d", ptr[i][j]);
}
printf("n");
}
}
Мои ошибки
/storage/emulated/0/C/Practice/Arrays/multidimensional arrays/quick_quic.c:19:10: warning:
incompatible pointer types passing 'int [3][3]'
to parameter of type 'int *'
[-Wincompatible-pointer-types]
display(arr,3,3);
^~~
/storage/emulated/0/C/Practice/Arrays/multidimensional arrays/quick_quic.c:4:18: note:
passing argument to parameter 'ptr' here
void display(int ptr[] ,int n,int nt);
^
/storage/emulated/0/C/Practice/Arrays/multidimensional arrays/quick_quic.c:29:23: error:
subscripted value is not an array, pointer, or
vector
printf("%d", ptr[i][j]);
~~~~~~^~
1 warning and 1 error generated.
Комментарии:
1. «Мой код выдает мне много ошибок», которые? Пожалуйста, процитируйте их здесь, полностью, в виде текста, дословно.
2. Вы показываете значения массива размером 2×3 и кодируете массив размером 3×3. Есть ли причина для такой разницы?
3. Я отредактировал вопрос с ошибками
Ответ №1:
Для полных новичков, которых я рассматриваю, вы должны передать многомерный массив, вам также необходимо указать границу в аргументе.
Примечание: — Внутренняя граница не обязательна, но внешняя граница обязательна!
В приведенном выше случае
void display(int ptr[][3] ,int n,int nt);
И то же самое при определении функции
Это
void display(int ptr[][3],int n,int nt){
for(int i=0 ; i<n ; i ){
for(int j=0 ; j<nt ; j ){
printf("%d", ptr[i][j]);
}
printf("n");
}
}
Таким образом, правильная программа для приведенного выше была бы
#include <stdio.h>
void display(int ptr[][3],int n,int nt);
int main(){
int arr[3][3];
for(int i=0 ; i<3 ; i ){
for(int j=0 ; j<3 ; j ){
scanf("%d", amp;arr[i][j]);
}
}
display(arr,3,3);
return 0;
}
void display(int ptr[][3],int n,int nt){
for(int i=0 ; i<n ; i ){
for(int j=0 ; j<nt ; j ){
printf("%d", ptr[i][j]);
}
printf("n");
}
}
Также вы всегда можете использовать указатель или вызвать по ссылке, если будете изучать дальше, вы изучите и это!
Редактировать:
Использование указателей
#include <stdio.h>
void display(int *ptr,int n,int nt);
int main(){
int arr[3][3];
for(int i=0 ; i<3 ; i ){
for(int j=0 ; j<3 ; j ){
scanf("%d", amp;arr[i][j]);
}
}
//passing the pointer to first element
display(amp;arr[0][0],3,3);
return 0;
}
void display(int *ptr,int n,int nt){
for(int i=0 ; i<n ; i ){
for(int j=0 ; j<nt ; j ){
printf("%d",*((ptr i*n) j));
}
printf("n");
}
}
Подробнее о указателе на массив читайте здесь
Комментарии:
1. Большое Вам спасибо за такое кристально чистое понимание 🤘. Не могли бы вы, пожалуйста, также отредактировать подход с указателями
2. Привет, могу я попросить тебя о помощи.
Ответ №2:
Тип arr
( int [3][3]
) не соответствует ptr
( int []
). Чтобы это сработало, вам придется либо изменить тип ptr
:
void display( int ptr[][3], int n, int nt )
{
...
}
или вам нужно будет притвориться, что arr
является одномерным массивом — вы можете сделать это, передав адрес первого элемента явно:
display( amp;arr[0][0], 3, 3 );
а затем в display
использовать один нижний индекс:
printf( "%d", ptr[i * n j] );
Комментарии:
1. Для меня это становится все сложнее. 😶. Я не могу понять