С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
9 / 13 / 3
Регистрация: 18.08.2009
Сообщений: 487

Проясните работу с указателями функций

27.10.2009, 13:10. Показов 1059. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
void fn(intArg)
{
 int intArg=10;
 // здесь значение intArg равно 10
}
 
void parent(void)
{
 int n1=0;
 fn(n1);
 // здесь n1 равно 0
}
По логике в функции parent() перменная n1 должна получить значение 10. Но она останется равной 0. В книжке написано, что это происходит, потому что функции передается не переменная, а значение, которое в момент вызова функции находится в переменной.

Получается, что n1 в момент вызова функции parent() будет иметь значение 0. Это значение передастся функции fn(). Т.е. будет
C++
1
2
3
4
5
6
7
8
void parent(void)
{
 int n1=0;
 fn(0)
 {
  int 0=10;
 }
}
Что за ерунда получается?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2009, 13:10
Ответы с готовыми решениями:

Проясните работу цикла
Дана программа program n1; var i,j: integer; BEGIN for i:=12 to 15 do j:=i mod 10; WriteLn(j); END.

Разобрать код, демонстрирующий работу с указателями
Здравствуйте. Помогите пожалуйста разобраться с работой указателей. #include <iostream> using namespace std; int main() ...

Вызовы функций с указателями
У меня всё получилось с первыми 3 функциями , а что в 4 я совсем не пойму.. #include <stdio.h> #include <math.h> ...

6
54 / 50 / 9
Регистрация: 16.05.2008
Сообщений: 162
27.10.2009, 13:30
fs444,
Цитата Сообщение от fs444 Посмотреть сообщение
По логике в функции parent() перменная n1 должна получить значение 10.
Так вот не должна. Смотрим твой код
C++
1
2
3
4
5
6
7
8
9
10
 void fn(intArg)
{
 int intArg=10; // здесь создается и инициализируется локальная переменная intArg
}
 
void parent(void)
{
 int n1=0; // здесь создается и инициализируется переменная n1
 fn(n1);
}
То есть мы имеем две совершенно разные переменные у которых свои собственные адреса и значения. Если же ты хочешь вызовом функции присвоить переменной какое-либо значение то передовать в функцию следует либо указатель на переменную либо ссылку на нее, например:
C++
1
2
3
4
5
6
7
8
9
10
 void fn(int& intArg)
{
  intArg = 10; 
}
 
void parent(void)
{
 int n1=0;
 fn(n1);
}
, или так
C++
1
2
3
4
5
6
7
8
9
10
 void fn(int* intArg)
{
 *intArg=10;
}
 
void parent(void)
{
 int n1 = 0;
 fn(&n1);
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
27.10.2009, 13:42
C
1
2
3
4
void fn(intArg)
{
 int intArg=10;
}
К тому же у тебя имя параметра совпадает с именем локальной переменой. Конкретно здесь это по боку, но обычно служит источником ошибок
0
9 / 13 / 3
Регистрация: 18.08.2009
Сообщений: 487
28.10.2009, 15:49  [ТС]
К тому же у тебя имя параметра совпадает с именем локальной переменой. Конкретно здесь это по боку, но обычно служит источником ошибок
Приведенный мной код я взял из книжки. Может, он там реально как чисто учебный материал приводился. Вместе с комментариями он выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void fn(intArg)
{
 int intArg=10;
 // здесь значение intArg равно 10
}
 
void parent(void)
{
 int n1=0;
 fn(n1);
 // здесь n1 равно 0
}
Пытался скомпилировать код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <iostream.h>
 
int main()
{
 void fn(intArg)
  {
   int intArg=10;
   // здесь значение intArg равно 10
  }
 void parent(void)
 {
  int n1=0;
  fn(n1);
  // здесь n1 равно 0
 }
}
и получил ошибку
[C++ Error] Ukazateli.cpp(6): E2084 Parameter names are used only with a function body
[C++ Error] Ukazateli.cpp(17): E2139 Declaration missing ;
[C++ Error] Ukazateli.cpp(17): E2190 Unexpected }
что такое "Parameter names are used only with a function body"?
Почему он ругается на какую то точку с запятой и скобку. Вроде синтаксически все правильно.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
28.10.2009, 15:59
функцию в теле другой ф-ции нельзя определять и описывать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <iostream.h>
void fn(intArg)
{
   intArg=10;
}
void parent(void)
{
  int n1=0;
  fn(n1);
  // здесь n1 равно 0
}
 
 
int main()
{
    parent();
    return 0;
}
0
9 / 13 / 3
Регистрация: 18.08.2009
Сообщений: 487
29.10.2009, 08:27  [ТС]
функцию в теле другой ф-ции нельзя определять и описывать.
Спасибо, понял
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
29.10.2009, 08:39
Цитата Сообщение от oxotnik Посмотреть сообщение
функцию в теле другой ф-ции нельзя определять и описывать
В GNU-C можно. Но это "плохой" стиль, т.к. программа совсем непереносимой становится. GNU'шники временами этим пользуются: типа мы вам выдали бесплатные исходники, но компилируются они только нашим компилятором
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2009, 08:39
Помогаю со студенческими работами здесь

Отличия в прототипах функций с указателями
Что значит символ указателя в прототипе функции? Например, void * create(...) {...} void create(...) {...} В колледже дали...

Объявление DllImport функций с указателями и ссылками
Есть статическая библиотека С++. Нужно импортировать в С# ее метод если функция с простой сигнатурой - примерно так получается ...

Передача параметров с указателями при написании функций
Помогите, напишите программу: Передача параметров с помощью указателей при написании функций. Найти среднее значение x (3 * 3) и y (4...

Передача параметров указателями при написании функций
Как написать вот такую программу : Вычислить и запомнить суммы положительных элементов каждой строки матрицы a(10,20), b(15,10)....

Как правильно переделать программу с двумерным массивом под работу с указателями?
Как правильно переделать программу с двумерным массивом под работу с указателями? Вот код программы #include &quot;stdafx.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru