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

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

10.01.2017, 12:40. Показов 4586. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru