Передача двумерного динамического массива в функцию через указатель - C (СИ)
Формулировка задачи:
Всем привет! Собственно сабж. Я почитал о том, как это делать, но слишком много случаев показано именно для c++ и без вывода этого массива на экран. (т.к. я новичок, извините если пример именно такого типа уже разжёвывали)
Программа должна создавать двумерный массив заданной размерности и в дальнейшем принять от пользователя значения для каждой ячейки. Потом должна происходить передача двумерного массива в функцию с помощью указателя и выводить на экран вбитые значения массива. Я сделал так:
Но программа вылетает с ошибкой после задания значений ячеек массива. Для меня очевидно, что я где-то ошибся, но не знаю где. Помогите пожалуйста)
#include <stdio.h>
#include <math.h>
int f1(int **b,int x,int y,int i, int j)
{
for (i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
printf("a[%d][%d]=%d\n",i,j,**b);
}
}
return(0);
}
int main()
{
int i,j,k,x,y,n1,*b;
printf ("strok\n");
scanf ("%d",&y);
printf ("stolbcov\n");
scanf ("%d",&x);
int a[x][y];
for (i=0;i<x;i++)
{
for (j=0;j<y;j++)
{
printf("vvedite chislo a[%d][%d]\n",i,j);
scanf("%d",&a[i][j]);
}
}
b=&a[0][0];
n1=f1(*b,x,y,0,0);
}Решение задачи: «Передача двумерного динамического массива в функцию через указатель»
textual
Листинг программы
#include <stdio.h>
int f1(int *b, int x, int y)
{
int i, j;
for (i = 0; i < x; ++i){
for (j = 0; j < y; ++j)
printf("%6d", *(b + i * y + j));
printf("\n");
}
return(0);
}
int main()
{
int i , j, x, y, *b;
printf ("strok\n");
scanf ("%d",&y);
printf ("stolbcov\n");
scanf ("%d", &x);
int a[x][y];
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
printf("vvedite chislo a[%d][%d]\n",i,j);
scanf("%d",&a[i][j]);
}
}
b = &a[0][0];
f1(b,x,y);
}
Объяснение кода листинга программы
- Объявление функции
f1, которая принимает три аргумента: указательbна массив, целые числаxиy. - Внутри функции
f1объявление двух переменныхiиj, которые будут использоваться в циклах. - Инициализация значений переменных
iиjв начале циклов. - Два вложенных цикла, которые будут выполняться столько раз, сколько указано в аргументах
xиy. - Внутри вложенных циклов происходит вывод значения элемента массива, на который указывает аргумент
b + i * y + j, с форматированием в шестом формате. - После окончания вложенных циклов выполняется перевод строки.
- В конце функции
f1возвращается значение 0, что означает успешное выполнение. - В функции
mainобъявление пяти переменных:i,j,x,yи указательb. - С помощью функции
scanfпользователю предлагается ввести значение для переменнойy, а затем для переменнойx. - Создание двумерного массива
aс помощью циклаfor, в котором пользователь вводит значения для каждого элемента массива. - Инициализация указателя
bс адресом первого элемента массиваa. - Вызов функции
f1с передачей аргументовb,xиy. - Конец функции
main.