Вопрос По Указателям

Тема в разделе "Общие вопросы по С и С++", создана пользователем Elena25, 7 дек 2011.

  1. Elena25

    Elena25 Гость

    В этой программе вводится с клавиатуры вводится двумерный массив и он печатается на экране

    1) Не получается использовать в scanf адрес ((a+i)+j) ????? (
    2) Не получается сделать ввод массива в подпрограмме (((((((((

    11111111111111111 Программа к первому вопросу:

    Код (C++):
    #include <iostream>
    #include <conio.h>
    using namespace std;
    int main ()
    {
    int a[10][10];
    int i, n, m, j, nom, c;
    printf ("vvod n=");
    scanf ("%d",&n);
    printf ("vvod m=");
    scanf ("%d",&m);
    for (i=0; i<n; i++)
    for (j=0; j<m; j++)
    scanf("%d",&a[i][j]);    //Почему здесь нельзя так -->: scanf("%d", ((a+i)+j));
    printf("Исходная матрица\n");
    for (i=0; i<n; i++)
    {
    for (j=0; j<m; j++) printf("%10d",*(*(a+i)+j));
    printf("\n");
    }
    getch();
    return 0;
    }
    2222222222222222222 Программа ко второму вопросу:

    Код (C++):
    int main ()
    {
    int a[10][10];
    int i, n, m, j, c, nom;
    int vvod(int [][],int,int);
    vvod(a,n,m);
    printf("Исходная матрица\n");
    for (i=0; i<n; i++)
    {
    for (j=0; j<m; j++) printf("%5d",a[i][j]);
    printf("\n");
    }
    getch();
    return 0;
    }
    int vvod(int x[10][10], int n, int m)
    {
    int i,j;
    printf ("vvod n=");
    scanf ("%d",&n);
    printf ("vvod m=");
    scanf ("%d",&m);
    for (i=0; i<n; i++)
    for (j=0; j<m; j++) scanf("%d",&x[i][j]);  
    return 0;  
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Потому что a не указатель.

    А почему не получается сделать ввод массива в подпрограмме?
     
  3. Elena25

    Elena25 Гость

    Нет, это как раз указатель - имя массива без индексов является указателем на свой 0-й элемент. Компиляция проходит без ошибок, но когда массив выводим на печать то только в первом столбце настоящие элементы массива, а в остальных - мусор
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Является указателем на указатель на первый элемент ! Именно поэтому конструкция ((a+i)+j) и не работает.
     
  5. Elena25

    Elena25 Гость

    Но когда массив выводишь на экран эта конструкция работает:
    printf("%d", *(*(a+i)+j))

    И если для одномерных массивов: scanf("%d",(a+i)) тоже работает
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Читай про разыменование указателей.
     
  7. Elena25

    Elena25 Гость

    А массив почему не заполняется с помощью функции? Не пойму в чем дело и описание и прототип есть, может компилятор какой-то кривой?
     
  8. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А почему он должен заполняться? Ведь ((a+i)+j) = a+i+j , тогда почему конструкция scanf( "%d", a+i+j ) должна работать?
    Думай сама.

    Вот тебе подсказка:
    *a - простой указатель
    **b - указатель на указатель
    ***c - указатель на указатель, который указывает на указатель

    *(a + x) - разыменование простого указателя.
    *(*(b + x) + y) - разыменования двойного указателя.
    *(*(*(c + x) + y) + z) - разыменования тройного указателя.
     
  9. Elena25

    Elena25 Гость


    Нет, у меня во второй программе не используется такая запись, просто ввод в подпрограмме не идет, сейчас и в visual studio пробовала:

    Код (C++):
    #include <iostream>
    #include <conio.h>

    int main()
    {

    int a[10][10];
    int i, n, m, j, c, nom;
    int vvod(int [10][10],int,int);
    vvod(a,n,m);
    printf("Исходная матрица\n");
    for (i=0; i<n; i++)
    {
    for (j=0; j<m; j++) printf("%5d",a[i][j]);
    printf("\n");
    }
    getch();
    return 0;
    }
    int vvod(int x[10][10], int n, int m)
    {
    int i,j;
    printf ("vvod n=");
    scanf ("%d",&n);
    printf ("vvod m=");
    scanf ("%d",&m);
    for (i=0; i<n; i++)
    for (j=0; j<m; j++) scanf("%d",&x[i][j]);  
    return 0;  
    }
     
  10. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    У тебя в функции переменные n и m инициализируются локально. В функцию main они не возвращаются. Используй указатели или ссылки.
     
  11. Elena25

    Elena25 Гость


    Все ясно :blush:) СПАСИБО!
     
Загрузка...
Похожие Темы - Вопрос По Указателям
  1. ApplePen
    Ответов:
    0
    Просмотров:
    76
  2. gURaBA_N
    Ответов:
    3
    Просмотров:
    94
  3. kartaman
    Ответов:
    0
    Просмотров:
    128
  4. Peter
    Ответов:
    4
    Просмотров:
    524
  5. di0d_
    Ответов:
    1
    Просмотров:
    440

Поделиться этой страницей