Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
#1

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

11.07.2013, 17:51. Просмотров 418. Ответов 8
Метки нет (Все метки)

Имя массива это константный указатель.
Когда мы передаем его в функцию
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;
выдает один и тот же адресс ведь мы делаем а++?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2013, 17:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача массива в функцию - что на самом деле предается? (C++):

что же на самом деле делает strcpy? - C++
вот такой пример #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () { string buff; buff += &quot;what a...

Что такое string на самом деле? - C++
Всем привет! Столкнулся с проблемой и никак не могу разобраться. Мне необходимо из строки string str получить unsignet char* для...

Что такое ссылка на самом деле? - C++
Здравствуйте. Насколько я понимаю, ссылка - это переменная, которая на самом деле является указателем на адрес другой переменной, но с...

Оператор \ выражение - что же это такое на самом деле? - C++
Какого ... выражение называют оператором?

Число double 0.1 на самом деле не 0.1 - C++
Кто сталкивался с таким глюком, почему если я задаю double x=0.1; в дебаггере я его вижу как 0.10000000000000001 ? я знал что float...

На самом деле #define'а нету. - C++
На самом деле #define нету. Вот например если мы напишем в c++ #define yes 1 #define no 0 то на самом деле мы получим int yes=1; ...

8
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.07.2013, 18:49 #2
представьте, что вы свою фотография отсканировали и отправили скан другу, а он на скане вам усы подрисовал. На исходной фотографии ничего же не поменялось, так и тут, заводится переменная-указатель, в которую записывается адрес массива, с которой, собственно и происходит работа.
0
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?
0
Thinker
Эксперт С++
4228 / 2202 / 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 и все, ее месторасположение и не должно меняться
0
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;а++;
, почему при каждой итерации в цикле адресс а не меняется
0
Thinker
Эксперт С++
4228 / 2202 / 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, почему он должен меняться?
0
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;
а в моем а не меняется. Почему?
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.07.2013, 19:42 #8
почему же, просто выводите правильно
C++
1
cout << a;
1
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
11.07.2013, 21:38  [ТС] #9
А ну да. Бывает.

Добавлено через 1 час 43 минуты
В смысле спасибо!
0
11.07.2013, 21:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 21:38
Привет! Вот еще темы с ответами:

ошибки которых на самом деле нет - C++
possible use of идентификатор before diffinotion(С++) у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены...

Передача массива в функцию. Не могу понять что не так - C++
Добрый вечер. Помогите, пожалуйста, решить проблему. Задание такое: Дана целочисленная прямоугольная матрица, все элементы которой...

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...

Передача двухмерного массива из функцию в функцию - C++
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его передать в другую функцию, которая его выведет на экран. ...


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

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

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