• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

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

Elena25

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

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

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

lazybiz

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

Elena25

Является указателем на указатель на первый элемент ! Именно поэтому конструкция ((a+i)+j) и не работает.

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

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

lazybiz

Читай про разыменование указателей.
 
E

Elena25

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

lazybiz

А массив почему не заполняется с помощью функции?
А почему он должен заполняться? Ведь ((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

А почему он должен заполняться? Ведь ((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;	
}
 
L

lazybiz

У тебя в функции переменные n и m инициализируются локально. В функцию main они не возвращаются. Используй указатели или ссылки.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!