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

  • Автор темы Elena25
  • Дата начала
E

Elena25

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

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;	
}
 
E

Elena25

#3
Потому что a не указатель.

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

lazybiz

Well-known member
03.11.2010
1 339
0
#4
имя массива без индексов является указателем на свой 0-й элемент
Является указателем на указатель на первый элемент ! Именно поэтому конструкция ((a+i)+j) и не работает.
 
E

Elena25

#5
Является указателем на указатель на первый элемент ! Именно поэтому конструкция ((a+i)+j) и не работает.
Но когда массив выводишь на экран эта конструкция работает:
printf("%d", *(*(a+i)+j))

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

Elena25

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

lazybiz

Well-known member
03.11.2010
1 339
0
#8
А массив почему не заполняется с помощью функции?
А почему он должен заполняться? Ведь ((a+i)+j) = a+i+j , тогда почему конструкция scanf( "%d", a+i+j ) должна работать?
Думай сама.

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

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

Elena25

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

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

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

Нет, у меня во второй программе не используется такая запись, просто ввод в подпрограмме не идет, сейчас и в 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;	
}
 

lazybiz

Well-known member
03.11.2010
1 339
0
#10
У тебя в функции переменные n и m инициализируются локально. В функцию main они не возвращаются. Используй указатели или ссылки.