Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 40

Передача в функцию константы вместо указателя

10.01.2017, 12:40. Показов 4537. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Копаясь в чужом коде, обнаружил для себя странность в вызове функции. В C++ я разбираюсь слабо.

Функция (точнее метод класса) объявлена следующим образом:
C++
1
2
3
4
5
6
7
class AP_Param
{
  public:
    ...
    static AP_Param * find(const char *name, ...);
  ...
};
В качестве параметра функция ожидает получить указатель.
Далее в коде я обнаружил три разных варианта вызова:

1-й способ (передаётся указатель):
C++
1
2
3
char *pdup = strdup(parm);
...
AP_Param *vp = AP_Param::find(pdup, ...);
2-й способ (передаётся переменная)
C++
1
2
3
char param_name[AP_MAX_NAME_SIZE+1];
...
vp = AP_Param::find(param_name, ...);
3-й способ (передаётся константа):
C++
1
fence_count = (AP_Int8 *)AP_Param::find("FENCE_TOTAL", ...);
Разъясните, пожалуйста, два вопрос:

1. Можно ли в общем случае, если функция ожидает на вход указатель, передавать ей непосредственно значение (как в примере 3)?

2. Является ли 3-й способ вызова метода в данном конкретном примере правильным и можно ли его использовать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2017, 12:40
Ответы с готовыми решениями:

Передача в функцию - ссылки, указатели, константы
Вот программа: #include <iostream> void fun(int &rhs) { rhs++; } int main()

Передача указателя на шаблонную функцию в другую функцию
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Передача указателя в функцию
Здравствуйте. Прошу помощи, сижу уже пару часов читаю мануалы, но так и не смог до конца понять, что мне делать. Есть вот такой код: ...

4
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
10.01.2017, 13:06
Лучший ответ Сообщение было отмечено standmit как решение

Решение

Дело в том, что строки в языке Си являются массивам (строки типа char* характерны именно для языка Си, не С++). А массивы могут передаваться только по указателю, передача массивов по значению вообще не предусмотрена. Таким образом, во всех трёх случаях строка передаётся по указателю. Ответ на второй вопрос - да, третий способ является корректным, в нём передаётся указатель на константный массив.

Добавлено через 5 минут
Кстати, вышесказанное относится не только к строкам, но и к любым другим массивам. Если функция принимает указатель, то ей можно передавать как непосредственно указатель, так и массив (реально передаётся указатель на первый элемент массива).
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
10.01.2017, 13:22
Цитата Сообщение от likehood Посмотреть сообщение
А массивы могут передаваться только по указателю
Нет. Массивы могут передаваться и по ссылке.

Добавлено через 20 секунд
Просто преобразование массива в указатель является стандартным

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
template <typename T>
void foo(const T&)
{}
 
int main()
{
    int arr[5];
    foo(arr); // OK
}
Добавлено через 1 минуту
И даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
template <size_t N>
void foo(const int (&)[N])
{
    std::cout << N;
}
 
int main()
{
    int arr[5];
    foo(arr); // OK
}
2
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
10.01.2017, 13:33
Цитата Сообщение от MrGluck Посмотреть сообщение
Массивы могут передаваться и по ссылке.
Да, так будет точнее. В любом случае, массивы не передаются по значению.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
10.01.2017, 16:42
Цитата Сообщение от MrGluck Посмотреть сообщение
И даже так:
И даже так (по указателю на массив):
C++
1
2
3
4
5
6
7
8
9
10
11
template <size_t N>
void foo(const int (*)[N])
{
    std::cout << N;
}
 
int main()
{
    int arr[5];
    foo(&arr); // OK
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2017, 16:42
Помогаю со студенческими работами здесь

Передача указателя на функцию
Доброго дня Форумчане. Хотелось бы узнать как вызывать функцию получив на нее указатель? пример class C1 { public: void...

передача указателя на функцию
Помогите исправить ошибку уже незнаю как быть В бивает ту ошибку error C2664: Generate: невозможно преобразовать параметр 2 из...

Передача указателя на функцию
Друзья подскажите пожалуйста где ошибка. Я хочу передать указатель на функцию из экземпляра класса cThreadPool в главный класс. Возникает...

Передача указателя в функцию
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете пропустить. Задали на лабе сделать некий...

Передача в функцию указателя
Почему плохо передавать в функцию указатель на строку или массив и возвращать указатель на строку или массив?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru