Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
40 / 29 / 12
Регистрация: 09.06.2018
Сообщений: 137
1

Как передать в функцию указатель на двумерный массив?

31.07.2018, 14:57. Просмотров 4056. Ответов 31
Метки нет (Все метки)


Есть массив int arr[5][5], как передать в функцию указатель на него, чтобы при изменения массива в функции он изменялся везде?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2018, 14:57
Ответы с готовыми решениями:

Как правильно передать в функцию указатель на двумерный массив?
Сабж #include <windows.h> #include <stdio.h> using namespace std; //ОТ безысходности сделал...

Как передать в функцию указатель на двумерный массив заранее неизвестного размера?
Ребята, скажите пожалуйста, как реализовать такую идею? Необходимо передать в функцию двумерный...

Как передать в подпрограмму указатель на двумерный массив?
как передать в подпрограмму указатель на двумерный массив???

Указатель на массив констант. Как передать в функцию?
С наступающим! Нужно передать указатель на stule_a(b) в функцию. А из функций уже выбирать саму...

31
"C with Classes"
1616 / 1241 / 472
Регистрация: 16.08.2014
Сообщений: 5,213
Записей в блоге: 1
31.07.2018, 15:02 2
Цитата Сообщение от 3C_273 Посмотреть сообщение
Как передать в функцию указатель на двумерный массив?
никак, передать можешь только указатель на начало массива.
0
2750 / 1697 / 352
Регистрация: 09.09.2017
Сообщений: 7,141
31.07.2018, 15:03 3
Так и передавать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h>
 
void func(int arr[5][5]){
  arr[0][0]=1; arr[1][1]=1; arr[2][2]=1; arr[3][3]=1; arr[4][4]=1;
}
 
void outarr(int arr[5][5]){
  for(int j=0; j<5; j++){
    for(int i=0; i<5; i++)printf("%i\t", arr[i][j]);
    putchar('\n');
  }
}
 
int main(){
  int a[5][5];
  memset(a, 0, sizeof(a));
  a[4][0]=2;
  outarr(a);
  func(a);
  printf("--------------\n");
  outarr(a);
}
1
470 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
31.07.2018, 15:04 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
void generate(int arr[5][5])
{
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            arr[i][j] = i + j;
}
 
void print(int arr[5][5])
{
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
            std::cout << arr[i][j] << " ";
        std::cout << std::endl;
    }
}
 
int main()
{
    int arr[5][5];
    generate(arr);
    print(arr);
    return 0;
}
COKPOWEHEU, опередил)
1
"C with Classes"
1616 / 1241 / 472
Регистрация: 16.08.2014
Сообщений: 5,213
Записей в блоге: 1
31.07.2018, 15:04 5
или ссылку на указатель
0
Croessmah
31.07.2018, 15:06
  #6

Не по теме:

Цитата Сообщение от SuperKir Посмотреть сообщение
void generate(int arr[5][5])
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
void func(int arr[5][5])
Юмористы. :)

0
"C with Classes"
1616 / 1241 / 472
Регистрация: 16.08.2014
Сообщений: 5,213
Записей в блоге: 1
31.07.2018, 15:12 7
3C_273,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <cstddef>
#include <iostream>
 
template <typename T, std::size_t m, std::size_t n>
void ShowArray(T (&a)[m][n] )
{
    for (auto& r1 : a)
    {
        for (auto& r2 : r1)
            std::cout << r2 << ' '; 
 
        std::cout << std::endl;
    }
}
 
int main()
{
    int a1[3][3] {1, 2, 3, 1, 2, 3, 1, 2, 3};
    char a2[3][3] {'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'};
 
    ShowArray(a1);
    ShowArray(a2);
 
    return 0;
}
2
40 / 29 / 12
Регистрация: 09.06.2018
Сообщений: 137
31.07.2018, 15:19  [ТС] 8
_stanislav, COKPOWEHEU, SuperKir, Огромное спасибо
0
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
31.07.2018, 18:22 9
3C_273, в вариантах предложенных выше массив передаётся непосредственно или по ссылке. если Вам нужно
Цитата Сообщение от 3C_273 Посмотреть сообщение
передать в функцию указатель на него
для статического массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <ctime>
using namespace std;
 
void Modification (int (*x)[5])
{
    for (int i = 0; i < 5; i++)    
    for (int j = 0; j < 5; j++) 
    x[i][j]=x[i][j]+1;  
}   
 
int main()
{
    srand((int)time(0)); 
    int a[5][5];
 
    for (int i = 0; i < 5; i++)
    {
    for (int j = 0; j < 5; j++)
    {
    a[i][j]=rand()%8 + 1;
    cout <<a[i][j]<<" ";
    }
    cout << endl;
    }
    cout << endl;
    
    Modification (a);    
    
    for (int i = 0; i < 5; i++)
    {
    for (int j = 0; j < 5; j++)
    cout <<a[i][j]<<" ";    
    cout << endl;
    }
    
system("pause");
return 0;
}
для динамического массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <ctime>
using namespace std;
 
void Modification (int **x, const int N)
{
    for (int i = 0; i < N; i++)    
    for (int j = 0; j < N; j++) 
    x[i][j]=x[i][j]+1;  
}  
 
int main()
{
    srand((int)time(0));
    
    const int n=5;
    
      int **a = new int*[n]; 
    for (int i = 0; i < n; i++)
      a[i]=new int[n];
    
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < n; j++)
    {
    a[i][j]=rand()%8 + 1;
    cout <<a[i][j]<<" ";
    }
    cout << endl;
    }
    cout << endl;
    
    Modification (a, n);    
    
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < n; j++)
    cout <<a[i][j]<<" ";    
    cout << endl;
    }
    
    for (int i = 0; i < n; i++)
    delete [] a[i];
    delete [] a;
system("pause");
return 0;
}
1
Don't worry, be happy
16970 / 9851 / 1897
Регистрация: 27.09.2012
Сообщений: 24,426
Записей в блоге: 1
31.07.2018, 19:55 10
Цитата Сообщение от Yetty Посмотреть сообщение
передаётся непосредственно или по ссылке.
В одном коде выше передается ссылка на массив, в других - указатель. Массивы "непосредственно" не передаются. Параметр функции int arr[5][5] будет иметь тип int (*)[5].
0
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
31.07.2018, 20:18 11
Croessmah, Вы хотите сказать, что a[5][5] - это указатель на массив, а не массив ?
0
Don't worry, be happy
16970 / 9851 / 1897
Регистрация: 27.09.2012
Сообщений: 24,426
Записей в блоге: 1
31.07.2018, 20:28 12
Цитата Сообщение от Yetty Посмотреть сообщение
Вы хотите сказать, что a[5][5] - это указатель на массив, а не массив ?
В параметре функции - да
C++
1
2
3
4
void foo(int arr[5]);//arr имеет тип int *
void foo(int arr[5][5]);//arr имеет тип int (*)[5]
void foo(int arr[5][5][5]);//arr имеет тип int (*)[5][5]
//...
1
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
31.07.2018, 20:44 13
Croessmah, т.е. Вы считаете что void foo (int arr[5]) и void foo (int * arr) это одно и тоже и называется передачей массива по указателю, я Вас правильно понимаю ?
0
Don't worry, be happy
16970 / 9851 / 1897
Регистрация: 27.09.2012
Сообщений: 24,426
Записей в блоге: 1
31.07.2018, 21:24 14
Цитата Сообщение от Yetty Посмотреть сообщение
т.е. Вы считаете что void foo (int arr[5]) и void foo (int * arr) это одно и тоже и называется передачей массива по указателю, я Вас правильно понимаю ?
Это не я считаю, таковы правила языка. Но называется это просто передача указателя.

из стандарта:
The type of a function is determined using the following rules. The type of each parameter (including function parameter packs) is determined from its own decl-specifier-seq and declarator. After determining the type of each parameter, any parameter of type “array of T” or of function type T is adjusted to be “pointer to T”
1
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
31.07.2018, 21:45 15
Цитата Сообщение от Yetty Посмотреть сообщение
Вы считаете что void foo (int arr[5]) и void foo (int * arr) это одно и тоже и называется передачей массива по указателю
Текст стандарта приведен выше, но в этом также можно легко убедиться на практике с помощью компилятора.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
void foo(int * a);
void boo(int a[5]);
 
int main()
{
    std::cout << "Are Foo and Boo the same (y/n)? " 
              << "ny"[std::is_same<decltype(foo), decltype(boo)>::value];
}
http://rextester.com/TIDC49962
1
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
01.08.2018, 09:58 16
перевод стандарта:
Цитата Сообщение от Croessmah Посмотреть сообщение
После определения типа каждого параметра любой параметр типа «массив Т» или типа функции Т настраивается как «указатель на Т»
то что функция работает с массивом как с указателями с этим я согласен и говорил не об этом.

но я считаю, что в функцию в случае boo(int a[5]) передаётся массив, и лишь затем компилятор преобразует массив в указатели, поэтому говорить что в функцию в этом случае передаётся указатель как то не очень, тем более что в приведённых фразах из стандарта ничего подобного не утверждается.
0
2750 / 1697 / 352
Регистрация: 09.09.2017
Сообщений: 7,141
01.08.2018, 10:25 17
Цитата Сообщение от Yetty Посмотреть сообщение
в функцию в случае boo(int a[5]) передаётся массив, и лишь затем компилятор преобразует массив в указатели
Если бы передавался массив, его изменение в функции не меняло бы переданное значение (как в случае с другими типами данных), но это не так.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
 
struct SArr{
  int arr[5];
};
 
void func_ptr(int arr[5]){ //передача по указателю
  arr[1] = 1;
}
 
void func_arr(struct SArr x){ //передача по значению
  x.arr[2] = 2;
}
 
int main(){
  struct SArr val={.arr={0,0,0,0,0}};
  func_arr(val);
  func_ptr(val.arr);
  printf("%i %i %i %i %i\n", val.arr[0], val.arr[1], val.arr[2], val.arr[3], val.arr[4]);
}
Код
$ gcc main.c -Wall
$ ./a.out 
0 1 0 0 0
Как видим, при передаче в функцию непосредственно массива, он передается по указателю на исходные элементы. Тогда как при передаче по значению передается копия.
0
Don't worry, be happy
16970 / 9851 / 1897
Регистрация: 27.09.2012
Сообщений: 24,426
Записей в блоге: 1
01.08.2018, 10:47 18
Цитата Сообщение от Yetty Посмотреть сообщение
передаётся массив
Таким образом массивы не копируются.
Еще раз. Параметр будет иметь указательный тип, а не тип массива.
C++
1
2
3
4
5
6
7
8
9
10
void foo(int arr[5])//arr имеет тип int *
{
   //...
}
 
//...
int arr[100500];
foo(arr);//ok
int i{};
foo(&i);//ok
Поэтому говорить что в функцию в этом случае передаётся указатель как то не очень
Прямым текстом написано, если параметр массив, то будет указатель, а не массив.

Добавлено через 3 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
тем более что в приведённых фразах из стандарта ничего подобного не утверждается.
Там написано следующее (если показать на примере):
C++
1
2
3
//any parameter of type “array of T” or of function type T is adjusted to be “pointer to T”
void foo(int x[10])//x - имеет тип int*, а не int[5]
void foo(void (f)(int))//f имеет тип void (*)(int), а не void(int)
Можете даже так проверить:
C++
1
2
3
4
void foo(int arr[5])
{
    std::cout << std::is_same<decltype(arr), int *>::value << std::endl;
}
Хотя, DrOffset уже и так всё написал.
1
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
01.08.2018, 10:58 19
Цитата Сообщение от Yetty Посмотреть сообщение
но я считаю, что в функцию в случае boo(int a[5]) передаётся массив, и лишь затем компилятор преобразует массив в указатели, поэтому говорить что в функцию в этом случае передаётся указатель как то не очень, тем более что в приведённых фразах из стандарта ничего подобного не утверждается.
Как же не утверждается, когда этот пункт черным по белому начинается с фразы "The type of a function is determined using the following rules".
Т.е. далее описаны правила, по которым формируется тип функции. Т.е. еще раз, тут описаны не правила преобразования выражений, а правила формирования типа. И вот когда тип будет сформирован в нем параметры-массивы оказываются заменены на указатели. Т.е. тип оказывается абсолютно идетичен тому, как если бы мы сразу эти указатели там написали. По этой же причине у нас не получится сделать такую перегрузку
C++
1
2
void foo(int * p);
void foo(int a[5]);
т.к. тип и имя у этих функций - одинаковые.

Добавлено через 10 минут
Yetty, Можно еще посмотреть в раздел 11.1, где это прямым текстом уже написано.

— Parameter declarations that differ only in a pointer * versus an array [] are equivalent.
That is, the array declaration is adjusted to become a pointer declaration ([dcl.fct]).
Only the second and subsequent array dimensions are significant in parameter types ([dcl.array]).
[ Example:
C++
1
2
3
4
5
6
7
8
9
int f(char*);
int f(char[]);                  // same as f(char*);
int f(char[7]);                 // same as f(char*);
int f(char[9]);                 // same as f(char*);
 
int g(char(*)[10]);
int g(char[5][10]);             // same as g(char(*)[10]);
int g(char[7][10]);             // same as g(char(*)[10]);
int g(char(*)[20]);             // different from g(char(*)[10]);
— end example]
http://eel.is/c++draft/over.load#3.2
1
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
01.08.2018, 11:05 20
Цитата Сообщение от Croessmah Посмотреть сообщение
Прямым текстом написано, если параметр массив, то будет указатель, а не массив.
правильно, параметр - массив. а в функцию передаются параметры => в функцию передаётся массив. уже позже компилятор преобразует его в указатели. но это ПОЗЖЕ. а передаётся массив. поэтому говорить о том что передаётся указатель не вижу причин. пока не переубедили всем спасибо за комментарии.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2018, 11:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как передать в функцию указатель на двухмерный массив?
Здравствуйте. Как передать в функцию указатель на двухмерный массив? Код компилируется, но...

Как передать двумерный массив в функцию?
как передать двуммерный массив в функцию для дальнейшей работы на ним на языке си

Как передать двумерный массив в функцию
Есть двумерный сассив: int Graph = new int; Есть функция, принимающая двумерный массив:...

Как передать двумерный массив в функцию?
например у меня есть двумерный массив 5 на 5.мне нужна функция в которой будет запрашиваться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.