40 / 29 / 12
Регистрация: 09.06.2018
Сообщений: 137
|
|
1 | |
Как передать в функцию указатель на двумерный массив?31.07.2018, 14:57. Просмотров 4056. Ответов 31
Метки нет Все метки)
(
Есть массив int arr[5][5], как передать в функцию указатель на него, чтобы при изменения массива в функции он изменялся везде?
0
|
|
31.07.2018, 14:57 | |
Как правильно передать в функцию указатель на двумерный массив? Как передать в функцию указатель на двумерный массив заранее неизвестного размера? Как передать в подпрограмму указатель на двумерный массив? Указатель на массив констант. Как передать в функцию? |
|
2750 / 1697 / 352
Регистрация: 09.09.2017
Сообщений: 7,141
|
||||||
31.07.2018, 15:03 | 3 | |||||
Так и передавать:
1
|
470 / 422 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
|
||||||
31.07.2018, 15:04 | 4 | |||||
1
|
Croessmah
|
31.07.2018, 15:06
#6
|
0
|
"C with Classes"
|
||||||
31.07.2018, 15:12 | 7 | |||||
3C_273,
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, в вариантах предложенных выше массив передаётся непосредственно или по ссылке. если Вам нужно
для статического массива:
1
|
Don't worry, be happy
|
|
31.07.2018, 19:55 | 10 |
В одном коде выше передается ссылка на массив, в других - указатель. Массивы "непосредственно" не передаются. Параметр функции
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
|
||||||
31.07.2018, 20:28 | 12 | |||||
В параметре функции - да
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
|
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
|
||||||
31.07.2018, 21:45 | 15 | |||||
Текст стандарта приведен выше, но в этом также можно легко убедиться на практике с помощью компилятора.
1
|
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
|
|
01.08.2018, 09:58 | 16 |
перевод стандарта:
то что функция работает с массивом как с указателями с этим я согласен и говорил не об этом. но я считаю, что в функцию в случае boo(int a[5]) передаётся массив, и лишь затем компилятор преобразует массив в указатели, поэтому говорить что в функцию в этом случае передаётся указатель как то не очень, тем более что в приведённых фразах из стандарта ничего подобного не утверждается.
0
|
2750 / 1697 / 352
Регистрация: 09.09.2017
Сообщений: 7,141
|
||||||
01.08.2018, 10:25 | 17 | |||||
Если бы передавался массив, его изменение в функции не меняло бы переданное значение (как в случае с другими типами данных), но это не так.
Код
$ gcc main.c -Wall $ ./a.out 0 1 0 0 0
0
|
Don't worry, be happy
|
||||||||||||||||
01.08.2018, 10:47 | 18 | |||||||||||||||
Таким образом массивы не копируются.
Еще раз. Параметр будет иметь указательный тип, а не тип массива.
Добавлено через 3 минуты Там написано следующее (если показать на примере):
1
|
14016 / 7504 / 1774
Регистрация: 30.01.2014
Сообщений: 12,559
|
||||||
01.08.2018, 10:58 | 19 | |||||
Как же не утверждается, когда этот пункт черным по белому начинается с фразы "The type of a function is determined using the following rules".
Т.е. далее описаны правила, по которым формируется тип функции. Т.е. еще раз, тут описаны не правила преобразования выражений, а правила формирования типа. И вот когда тип будет сформирован в нем параметры-массивы оказываются заменены на указатели. Т.е. тип оказывается абсолютно идетичен тому, как если бы мы сразу эти указатели там написали. По этой же причине у нас не получится сделать такую перегрузку
Добавлено через 10 минут Yetty, Можно еще посмотреть в раздел 11.1, где это прямым текстом уже написано.
1
|
Тематические курсы и обучение профессиям онлайн Профессия Разработчик на C++ (Skillbox) Архитектор ПО (Skillbox) Профессия Тестировщик (Skillbox) |
5881 / 3998 / 2314
Регистрация: 18.12.2017
Сообщений: 12,527
|
|
01.08.2018, 11:05 | 20 |
правильно, параметр - массив. а в функцию передаются параметры => в функцию передаётся массив. уже позже компилятор преобразует его в указатели. но это ПОЗЖЕ. а передаётся массив. поэтому говорить о том что передаётся указатель не вижу причин. пока не переубедили
![]()
0
|
01.08.2018, 11:05 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь. Как передать в функцию указатель на двухмерный массив? Как передать двумерный массив в функцию? Как передать двумерный массив в функцию
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |