Передача двумерного динамического массива в функцию через указатель - 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);
}

Объяснение кода листинга программы

  1. Объявление функции f1, которая принимает три аргумента: указатель b на массив, целые числа x и y.
  2. Внутри функции f1 объявление двух переменных i и j, которые будут использоваться в циклах.
  3. Инициализация значений переменных i и j в начале циклов.
  4. Два вложенных цикла, которые будут выполняться столько раз, сколько указано в аргументах x и y.
  5. Внутри вложенных циклов происходит вывод значения элемента массива, на который указывает аргумент b + i * y + j, с форматированием в шестом формате.
  6. После окончания вложенных циклов выполняется перевод строки.
  7. В конце функции f1 возвращается значение 0, что означает успешное выполнение.
  8. В функции main объявление пяти переменных: i, j, x, y и указатель b.
  9. С помощью функции scanf пользователю предлагается ввести значение для переменной y, а затем для переменной x.
  10. Создание двумерного массива a с помощью цикла for, в котором пользователь вводит значения для каждого элемента массива.
  11. Инициализация указателя b с адресом первого элемента массива a.
  12. Вызов функции f1 с передачей аргументов b, x и y.
  13. Конец функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы