Форум программистов, компьютерный форум CyberForum.ru

Передача массива в функцию - что на самом деле предается? - C++

Восстановить пароль Регистрация
 
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
11.07.2013, 17:51     Передача массива в функцию - что на самом деле предается? #1
Имя массива это константный указатель.
Когда мы передаем его в функцию
C++
1
void f1(int *iArray)
f1 это происходит как pass by reference. В этой функции можно менять значения элементов массива и делать так
C++
1
iArray++
.
Теперь вопрос.
Делая так
C++
1
iArray++
мы изменяем адресс начала массива?
Но как это возможно, если Имя массива это константный указатель
А вот пример:
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
void f1(int *, int );
 
int q=444;
int *ptr=&q;//получаем левый адресс в памяти
 
int _tmain(int argc, _TCHAR* argv[])
{
           const int Size = 4
    int iArray[Size] = {2,3,4,5};
    f1(iArray, Size);
    cout << endl << ptr << ' ' << qa;
    _getch();
    return 0;
}
 
void f1(int *a, int n)
{
    int i=0;
    while (i<n)
    {
        cout << &a << endl;
        *a = 777;
        i++; 
        a++;
    }
    a=ptr; //присваиваем началу массива исходного "левый" адресс 
}
В итоге, что мы получим iArray будет указывать непонятно-куда?
И почему
C++
1
cout << &a << endl;
выдает один и тот же адресс ведь мы делаем а++?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2013, 17:51     Передача массива в функцию - что на самом деле предается?
Посмотрите здесь:

C++ ошибки которых на самом деле нет
C++ На самом деле #define'а нету.
Что такое ссылка на самом деле? C++
Число double 0.1 на самом деле не 0.1 C++
что же на самом деле делает strcpy? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.07.2013, 18:49     Передача массива в функцию - что на самом деле предается? #2
представьте, что вы свою фотография отсканировали и отправили скан другу, а он на скане вам усы подрисовал. На исходной фотографии ничего же не поменялось, так и тут, заводится переменная-указатель, в которую записывается адрес массива, с которой, собственно и происходит работа.
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
11.07.2013, 18:57  [ТС]     Передача массива в функцию - что на самом деле предается? #3
Да, я понимаю что есть локальный для функции f1 указатель, который хранит адресс массива в main - то есть над ним можно производить ариф. операции, ну и менять значения в iArray.
Но почему когда я указаетль а увеличиваю на 1(в данном случае 4 байта...да это зависти от системы итд...) то все равно выводит адресс а один и тот же эта строка
C++
1
cout << &a << endl;
в f1?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.07.2013, 19:10     Передача массива в функцию - что на самом деле предается? #4
C++
1
2
int arr[10], *pa = arr;
++pa;
после этого переменная pa содержит адрес второго элемента массива, а arr то мы не трогали (да и не могли)

Добавлено через 7 минут
если вы про
C++
1
cout << &a << endl;
то вы просто выводите адрес переменной-указателя a и все, ее месторасположение и не должно меняться
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
11.07.2013, 19:33  [ТС]     Передача массива в функцию - что на самом деле предается? #5
C++
1
2
int arr[10], *pa = arr;
++pa;
После первого ра++ адресс ра становится на 4 больше - скажем был 0018FE2C стал 0018FE30 - так?

Тогда вопрос в
C++
1
cout << &a << endl;а++;
, почему при каждой итерации в цикле адресс а не меняется
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.07.2013, 19:37     Передача массива в функцию - что на самом деле предается? #6
Цитата Сообщение от Aliru Посмотреть сообщение
После первого ра++ адресс ра становится на 4 больше - скажем был 0018FE2C стал 0018FE30 - так?
если int 32-разрядный, то да

Цитата Сообщение от Aliru Посмотреть сообщение
Тогда вопрос в
C++
1
cout << &a << endl;а++;
, почему при каждой итерации в цикле адресс а не меняется
компилятор выделяет память под переменную-указатель a, вы меняете ее значение (a++), но само расположение переменной a в памяти не меняется.
&a - адрес переменной a, почему он должен меняться?
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
11.07.2013, 19:42  [ТС]     Передача массива в функцию - что на самом деле предается? #7
Так в Вашем примере по-моему то же самое, но ра меняется с 0018FE2C на 0018FE30
C++
1
2
int arr[10], *pa = arr;
++pa;
а в моем а не меняется. Почему?
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.07.2013, 19:42     Передача массива в функцию - что на самом деле предается? #8
почему же, просто выводите правильно
C++
1
cout << a;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 21:38     Передача массива в функцию - что на самом деле предается?
Еще ссылки по теме:

Передача массива в функцию. Не могу понять что не так C++
C++ Что такое string на самом деле?
Передача массива в функцию используя указатель на функцию C++

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

Или воспользуйтесь поиском по форуму:
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
11.07.2013, 21:38  [ТС]     Передача массива в функцию - что на самом деле предается? #9
А ну да. Бывает.

Добавлено через 1 час 43 минуты
В смысле спасибо!
Yandex
Объявления
11.07.2013, 21:38     Передача массива в функцию - что на самом деле предается?
Ответ Создать тему
Опции темы

Текущее время: 11:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru