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

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

Восстановить пароль Регистрация
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
14.01.2013, 17:53     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #1
К примеру :
C++
1
2
3
4
5
6
7
8
9
10
11
int main() 
{   
    int x=3, y=4;
    swap(&x,&y);
        return 0;
}
void swap(int* a, int* b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
};
И без амперсанда

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main() 
{   
    int x=3, y=4;
    swap(x,y);
        return 0;
}
void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
};
Первый вариант работает из-за ссылок, а зачем тогда звездочки в переменных функции? Во втором все с указателями, но в первом тоже ссылки в указатели после компиляции переведутся. Почему тогда перемешка ссылок и указателей, я не пойму как это работает(.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2013, 17:53     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый?
Посмотрите здесь:

C++ Как передавать аргументы консольному приложению в Debug?
Поиск с барьером или без него C++
кто зделает тот самый крутой на етом сайте(на языке с++) C++
r6010 - Abort() (тот самый Страуструпп) C++
Можно ли как-то передавать в функцию то поле, какое нужно печатать C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.01.2013, 18:04     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #2
mzarb, второй вариант вообще не компилируется. Какие хедеры подключены? using namespace std используете?

Видимо, у вас вызывается std::swap
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.01.2013, 18:17     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #3
Цитата Сообщение от mzarb Посмотреть сообщение
Первый вариант работает из-за ссылок
в первом варианте ссылок нет
TrueBit
 Аватар для TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
14.01.2013, 18:38     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #4
В первом варианте вы передаете адрес переменных, в переменные-указатели, а во втором варианте вы пытаетесь значение переменных передатьи запихать их в переменную-указатель, где должен быть адрес.
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
14.01.2013, 19:11  [ТС]     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #5
Schizorb, да, это из-за пространства имен. Спасибо.

Jupiter, и правда, ссылки же в параметрах функции стоять должны, а не в аргументах. С этим разобрался. А почему если использовать указатели в параметрах функции и написать в аргументах массив без индекса, то не нужно ставить амперсанд? Получается что массив без индекса - как указатель, то есть он указывает на адрес начала массива в памяти, а не содержит его значение, по этому амперсанд не может взять адрес у адреса? Но ведь массив с индексом тоже не содержит значения, ведь array[i] после компиляции будет выглядеть как *(array+i), а array[0] тогда как *array. Чувствую, что ответил на свой вопрос, но не факт, что ещё правильно.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
14.01.2013, 19:43     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #6
Цитата Сообщение от mzarb Посмотреть сообщение
Получается что массив без индекса - как указатель
Ага, имя массива - cиноним адреса первого элемента. Можно вывести на экран и убедиться.
Цитата Сообщение от mzarb Посмотреть сообщение
array[i] после компиляции будет выглядеть как *(array+i), а array[0] тогда как *array
А тут уже не адреса, а значения, потому что применяется разыменование указателя.
C++
1
2
3
4
5
6
7
8
9
10
11
    int arr[5] = {1,2,3,4,5};
    
    // адрес первого элемента
    std::cout << arr << std::endl; // то же что и &arr[0]
    // адрес второго элемента
    std::cout << arr + 1 << std::endl;
    
    // значение первого элемента
    std::cout << *arr << std::endl; // то же что и arr[0]
    // значение второго элемента
    std::cout << *(arr + 1) << std::endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2013, 19:50     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый?
Еще ссылки по теме:

Почему я не могу ввести строчку используя меню, хотя программа работает без него C++
C++ Определить, какой сначала был день самый тёплый или самый холодный?

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

Или воспользуйтесь поиском по форуму:
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
14.01.2013, 19:50  [ТС]     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый? #7
Schizorb, теперь понял. Большое спасибо!
Yandex
Объявления
14.01.2013, 19:50     Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый?
Ответ Создать тему
Опции темы

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