Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
1

Что делает & в параметрах функции?

29.11.2017, 14:46. Просмотров 977. Ответов 22
Метки нет (Все метки)

Мне в учебнике попался пример с функцией вычисляющей площадь и периметр треугольника. В ней переменные периметра и площади прописаны в параметрах функции и там же объявлены.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <math.h>
int Triangle(float a, float b, float c, float &p, float &s)
{
// функция имеет два варианта выхода
// параметры a, b, c передаются по значению
// (только входные данные),
// параметры p, s, по ссылке
// (как входные данные, так и результат)
float pp; // полупериметр
if(a+b<=c||a+c<=b||b+c<=a) // треугольник не существует
     return 0;
else
{* // треугольник существует
     p=a+b+с;
     pp=0.5*p;
     s=sqrt(pp*(pp–a)*(pp–b)*(pp–c));
     return 1;
}
}
Я попытался изменить функцию так чтобы результаты расчётов она стала выводить в консоль программа поделена на 2 файла Заголовочный Header1.h который я вызываю через #include в файле с исходным кодом Source.spp
Header.h
C
1
2
3
4
5
6
7
8
9
10
11
12
void Triangle(float a, float b, float c, float &p, float &s)
{
    float pp;
    if (a + b <= c || a + c <= b || b + c <= a)
        printf("Не существует");
    else
    {
        p = a + b + c;
        pp = 0.5*p;
        s = sqrt(pp*(pp - a)*(pp - b)*(pp - c));
    }
}
Source.spp
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include "Header.h"
 
int Triangle(float a, float b, float c, float &p, float &s);
void main(void) {
    printf(Triangle(1, 2, 3, float &p, float &s));
}
Но в итоге программа не запускается из-за двух переменных с & в параметрах функции. Я их оттуда удалил и объявил в самой функции вот так
Header.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Triangle(float a, float b, float c)
{
    float pp;
    float p;
    float s;
    if (a + b <= c || a + c <= b || b + c <= a)
        printf("Не существует");
    else
    {
        p = a + b + c;
        pp = 0.5*p;
        s = sqrt(pp*(pp - a)*(pp - b)*(pp - c));
        printf("%f, %f\n",p, s);
    }
}
Source.cpp
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <Windows.h>
#include "Header.h"
 
void Triangle(float a, float b, float c);
void main(void) {
    Triangle(1, 2, 2);
    system("pause");
}
И всё заработало. Вопрос что это за & и для чего в учебнике его добавили? Я его пробовал гуглить в Инете инфы не нашёл, пробовал менять типы функции с Void на Int тоже ничего не дало. Я не вижу взаимосвязи. Программирую на Visual Studio.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.11.2017, 14:46
Ответы с готовыми решениями:

Стандартные действия с числами: что делает >> и & в коде
unsigned char bytes; bytes = ip &amp; 0xFF; bytes = (ip &gt;&gt; 8) &amp; 0xFF; ...

Объяснить, что делает операция *& и чем она отличается от простого указателя?
Пожалуйста объясните что делает этот оператор...чем он отличается от простого...

Что делает return в функции void?
void handle_arrival(vector&lt;Car&gt;&amp; cars, vector&lt; stack&lt;string&gt; &gt;&amp; parking_lot,...

Не могу определить назначение функции и то что она делает
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; struct llist{...

что делает size_t в данной функции, и сама функция
string toString() { stringstream buffer; for (size_t i = 0; i &lt;...

22
Kuzia domovenok
2438 / 2145 / 524
Регистрация: 25.03.2012
Сообщений: 7,725
Записей в блоге: 1
29.11.2017, 15:12 2
это не язык Си.

Добавлено через 31 секунду
Цитата Сообщение от viral Посмотреть сообщение
Source.cpp
это си++
1
DobroAlex
Модератор
392 / 334 / 165
Регистрация: 30.04.2016
Сообщений: 1,720
Завершенные тесты: 3
29.11.2017, 15:33 3
Лучший ответ Сообщение было отмечено viral как решение

Решение

viral, принимает ссылку на параметр, это С++
1
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
29.11.2017, 15:48 4
Цитата Сообщение от viral Посмотреть сообщение
printf(Triangle(1, 2, 3, float &p, float &s));
what, the fu**, is this?
1
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
30.11.2017, 13:54  [ТС] 5
DobroAlex, Какая тонкая грань между Си и Си++ Я уже долго пишу помочь мне с примерами в учебнике по Си++ и только сейчас мне написали да это же Си++ код)) Ладно я не очень понял что делает ссылка на параметр. Может потом разберусь

Добавлено через 1 минуту
GbaLog-, Это я думал как вывести результат вычислений в main в итоге пришёл к тому что нужно функцию объявить)

Добавлено через 22 часа 3 минуты
В общем ответ я нашёл программа должна выглядеть так
Header.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
int Triangle(float a, float b, float c, float &p, float &s)
{
    float pp;
    if (a + b <= c || a + c <= b || b + c <= a)
        return 0;
    else
    {
        p = a + b + c;
        pp = 0.5*p;
        s = sqrt(pp*(pp - a)*(pp - b)*(pp - c));
        return 1;
    }
}
Source.cpp
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <Windows.h>
#include "Header.h"
 
int Triangle(float a, float b, float c, float &p, float &s);
void main(void) {
    setlocale(0, "");
    float A, B, C;
    float Perim, Square;
    printf("введите стороны треуголника\n");
    scanf("%f%f%f", &A, &B, &C);
    if (Triangle(A, B, C, Perim, Square) == 1)
        printf("Периметр = %6.2f, Площадь = %6.2f\n", Perim, Square);
    else
        printf("Треугольник не существует\n");
    system("pause");
}
& в функции это указатель на переменную в программе, параметры функции с & являются и вводными и выводными данными. Их можно объявить в параметрах а затем вычислить. Вообще механика такая есть x и px, & работает как указатель переменной x и указывает откуда переменную берёт то есть &x = px также есть ещё действие * оно указывает направление куда указатель должен прийти то есть px = *y. Из чего следует что &x = *y. Я пока не понимаю точно как это работает. Просто что нагуглил написал сюда.
Программа выше работает.
0
GbaLog-
Любитель чаепитий
3167 / 1473 / 465
Регистрация: 24.08.2014
Сообщений: 5,207
Записей в блоге: 1
Завершенные тесты: 2
30.11.2017, 14:11 6
Цитата Сообщение от viral Посмотреть сообщение
& в функции это указатель на переменную в программе
неверно.
это ссылка.
0
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
30.11.2017, 14:20  [ТС] 7
GbaLog-, У меня больше вопросов к тому что я дальше написал) Я написал &x = px и &x = *y, но я так и не понял откуда взялась переменная px и как ссылка & определяет что значение надо взять именно из переменной px а не fx или ax если таковые имеются.
0
oldnewyear
413 / 411 / 157
Регистрация: 21.05.2016
Сообщений: 1,324
30.11.2017, 14:54 8
Цитата Сообщение от viral Посмотреть сообщение
Я написал &x = px и &x = *y
Зачем?
0
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
30.11.2017, 15:55  [ТС] 9
oldnewyear, А как, а что то не так? Что делает & в параметрах функции?
0
Kuzia domovenok
2438 / 2145 / 524
Регистрация: 25.03.2012
Сообщений: 7,725
Записей в блоге: 1
30.11.2017, 16:00 10
Цитата Сообщение от viral Посмотреть сообщение
oldnewyear, А как, а что то не так? Что делает & в параметрах функции?
обычно сначала изучают какие-то команды языка программирования, а только потом их применяют. Иначе как-то странно выходит спрашивать у других о том, что написал ты сам.
0
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
30.11.2017, 16:09  [ТС] 11
Kuzia domovenok, Но я это написал я просто не понимаю этого. Мне говорят что я не правильно называю ссылки указателями, я не понимаю что переменная px делает в этом примере. Я прочитал инфу в Интернете перечитал учебник. Если не можете разъяснять мне написанное мною в комментариях то скажите что я не правильно понимаю в указателях &. Какое отношение он имеет к параметрам в функциях? Если вы скажете мне, то этого ни в учебниках ни на сайте том по СИ++ я не нашёл.
0
TRam_
зомбяк
755 / 699 / 224
Регистрация: 14.05.2017
Сообщений: 2,401
30.11.2017, 16:28 12
Просто знай, что
C++
1
2
int a = 1;
int *p = &a;
и
C++
1
2
int a = 1;
int &s = a;
это абсолютно разные понятия.

Добавлено через 50 секунд
И внимательно почитай, чем первое применение "&" отличается от второго.
2
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
01.12.2017, 14:44  [ТС] 13
Первый вывод который я сделал это сложная тема и в ней путаются даже опытные программисты.

* это указатель на значение, в переменной по большей части он мало что меняет в функционале, переменные с ним также складываются и вычитаются как без него, но указатель даёт возможность удалять переменные при помощи delete (переменная). Что необходимо для экономии памяти на компьютере. Если запустить delete без указателей выйдет ошибка.

& Нужен для выведения адреса в памяти где расположена переменная достаточно вместо * написать & при выведении переменной. & это указатель на адрес переменной, строго говоря в СИ нет такого понятия как ссылка, есть указатели на адреса в памяти такие как 0046f8b8 или 0026fae4.
Выводится она через cout << "адрес C это " << &c << endl;. Правда не стоит делать это через printf иначе выйдет белеберда, я так полян это адрес памяти в десятичной форме скриншот тоже добавлю.
Можно сделать так чтобы 2 переменные ссылались на одно место в памяти через &. Делается это так int c; int &rc = c; зачем нужно? скорее всего для того чтобы сработал мой пример с функцией в самом начале. Вроде всё, прогу укажу ниже скриншоты тоже для тех кто загуглит тему в поисковике.

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
#include <stdio.h>
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main(int) {
    setlocale(0, "");
    int *a = new int;
    int *b = new int(3);
    int c;
    int &rc = c;
 
    *a = 10;
    *b = *a + *b;
 
    //cout << "b Это " << *b << endl;
    printf("%d\n", *b);
    cout << "адрес C через cout " << &c << endl;
    printf("адрес C через printf %d\n", &c);
    cout << "адрес RC через cout " << &rc << endl;
    delete a;
    delete b;
    system("pause");
}
0
Миниатюры
Что делает & в параметрах функции?   Что делает & в параметрах функции?  
COKPOWEHEU
1054 / 735 / 173
Регистрация: 09.09.2017
Сообщений: 3,263
01.12.2017, 15:27 14
Цитата Сообщение от viral Посмотреть сообщение
printf("адрес C через printf %d\n", &c);
Попробуйте "%X" вместо "%d"
Цитата Сообщение от viral Посмотреть сообщение
Что необходимо для экономии памяти на компьютере.
На самом деле у указателей куда больше применений: массивы изменяемого размера, деревья и прочее. Простейшее применение - передача в функцию для изменения переменной:
C
1
2
3
void increment(int *val){
  *val = *val + 1;
}
В С++ эта запись вполне работоспособна, но предпочтительной считается такая:
C++
1
2
3
void increment(int &val){
  val = val + 1;
}
Внутри эти две записи идентичны, но вторая выглядит проще (меньше звездочек) и включает автоматическую проверку на NULL, delete и прочие особенности работы с указателями: для программиста это просто внешняя переменная, которую функция может изменять.
Можно сравнить с созданием псевдонимов, о котором вы говорили int &val = ext_val;
0
TRam_
зомбяк
755 / 699 / 224
Регистрация: 14.05.2017
Сообщений: 2,401
01.12.2017, 15:28 15
Цитата Сообщение от viral Посмотреть сообщение
указатель даёт возможность удалять переменные при помощи delete (переменная). Что необходимо для экономии памяти на компьютере
Глупость.
Память программы разделяется на стек и на кучу. Стек содержит локальные, глобальные, статические переменные - в общем всё то, что зарезервированно в программе во время компиляции и размеры/положение чего изменяться во время выполнения не будет. Заполнен стек плотно, без пропусков. Куча же содержит разрозненные участки памяти, которые динамически ей выделяются во время выполнения. Это позволяет создавать массивы, размер которых становится известным только во время выполнения программы, создавать наборы из элементов различного заранее неизвестного размера, и в общем выделять память сообразно обрабатываемым программой данным/событиям.

Удалять переменные в стеке нельзя. Потому что это не предусмотренно, да и бессмысленно - сдвигать все-все остальные переменные программы было бы очень ресурсозататно. Удалять можно то, что в куче. Как уже догадался, участок памяти в куче выделяется с помощью вызова new, удаляется через delete . Причём удаляется не в смысле заполнения нулями, а в смысле того, что операционная система в дальнейшем может разрешить пользоваться данным участком памяти другому приложению.

Выдаваемый указатель во время вызова new, кроме того что он запоминается в твоей программе, запоминается также внутри операционной системы, с указанием сколько места выделено твоей программе далее этого указателя. Когда вызываешь delete, операционная система по адресу этого выделенного участка памяти удаляет запись о его выделении твоему приложению.

А запись
C++
1
int &rc
нужна для объявления ссылки. То есть rc не переменная, не указатель, а ссылка. Упрощённо можно представить что полученная в
C++
1
int &rc = c;
rc в точности эквивалентна *(&c). Зачем это нужно? Ну например затем, если нужно передать в функцию переменную c так, чтобы не использовать указатель, но при этом сохранялась возможноcть отредактировать c
0
viral
2 / 2 / 0
Регистрация: 02.05.2017
Сообщений: 79
01.12.2017, 16:17  [ТС] 16
TRam_, Вот есть допустим Стек и Куча. Я в куче могу вызвать переменную? Если да то тогда я не совсем понимаю почему же написал глупость. Поскольку из ранее сказанного видно что мои слова просто перефразировали и дополнили новыми терминами(Стек и Куча). И всё же так называемая куча была создана для временных переменных.
0
COKPOWEHEU
1054 / 735 / 173
Регистрация: 09.09.2017
Сообщений: 3,263
01.12.2017, 16:49 17
Что значит "вызвать переменную"?
TRam_, вероятно, неправильно догадался что же вы имели в виду своей формулировкой. Потому что формулировка действительно неправильная. Использование указателей для экономии памяти возможно только при ручном выделении - удалении объектов с помощью new/delete (malloc / free). Но это само по себе используется довольно редко. Разумеется, статическую переменную удалить нельзя. Надеюсь, вы это и имели в виду в том сообщении.
Цитата Сообщение от viral Посмотреть сообщение
И всё же так называемая куча была создана для временных переменных.
Не так.
Куча предназначена для динамически создаваемых переменных. Сколько они будут существовать неважно. Вы можете сразу выделить глобальную переменную и постоянно с ней работать. Собственно, именно так и придется поступать, поскольку размер кучи много больше размера стека. Стек это 8 МБ или около того, а куча - вся незанятая ОЗУ, все те гигабайты на современных системах.
0
smartpointer
69 / 63 / 39
Регистрация: 17.02.2014
Сообщений: 265
01.12.2017, 18:12 18
Цитата Сообщение от TRam_ Посмотреть сообщение
Стек содержит локальные, глобальные, статические переменные
Что за бред ? Стек содержит только локальные переменные, глобальные и статические переменные содержатся в другом месте, даже те, которые объявляются во внутренних функциях.
0
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,030
Записей в блоге: 2
Завершенные тесты: 1
01.12.2017, 21:41 19
Цитата Сообщение от smartpointer Посмотреть сообщение
глобальные и статические переменные содержатся в другом месте
В каком?
0
smartpointer
69 / 63 / 39
Регистрация: 17.02.2014
Сообщений: 265
01.12.2017, 22:12 20
Цитата Сообщение от dailydose Посмотреть сообщение
В каком?
В секции для данных обычно.
1
01.12.2017, 22:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2017, 22:12

Что значит & на конце параметра в функции?
void process_array (IntArray&amp;); Если здесь идет обращение к адресу объекта в...

Что означает знак & в объявлении функции
Здравствуйте, в обучающих статьях о С++ наткнулся на очень интересную...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка?
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size;...


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

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

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