Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для Default_070
26 / 26 / 26
Регистрация: 01.10.2015
Сообщений: 175

Что означает следующее выражение?

03.10.2015, 09:28. Показов 1588. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
char** SomeFunction(int num, int num1)
{
    // some code
}
Мне не понятно зачем здесь указатели? может кто подскажет. Если, что внутри функции выполняется выделение памяти под двумерный массив знаков(букв) и возвращается сам массив.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2015, 09:28
Ответы с готовыми решениями:

Указатель: что означает следующее объявление?
Подскажите пожалуйста, что означает следующее объявление? char (*ptr); // Что это? char *ptr2 // Массив указателей состоящий из 10...

Что означает выражение с-'0'?
"Если в переменной С находится символ цифры, точнее - код цифры, то выражение с-'0' даёт значение самого числа, код которого находится в ...

Что означает выражение
Подскажите, что означает данное выражение? for( i = 0; i < p; i++) { j = (i == (p - 1)) ? 0 : (i + 1); Добавлено через 1...

13
31 / 31 / 24
Регистрация: 08.06.2015
Сообщений: 107
03.10.2015, 09:38
Лучший ответ Сообщение было отмечено Default_070 как решение

Решение

Default_070, функция вернет значение переменной типа двойного указателя на char
1
 Аватар для Default_070
26 / 26 / 26
Регистрация: 01.10.2015
Сообщений: 175
03.10.2015, 09:40  [ТС]
Спасибо.
0
3 / 1 / 1
Регистрация: 03.10.2015
Сообщений: 11
03.10.2015, 09:49
Ну, так, ты сам же и ответил. Это сделано потому, что массивы создаются динамически. А как иначе вернуть этот массив вызывающему коду?

Добавлено через 4 минуты
Функция вернёт указатель на массив указателей. И указатели этого массива сами по себе будут массивами - будут содержать строки.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.10.2015, 09:52
нет такого типа, как двойной указатель. Есть указатель на указатель.
Функция вернет такой указатель, который указывает на указатель, указывающий на char.

Цитата Сообщение от freeworker Посмотреть сообщение
Функция вернёт указатель на массив указателей
нефига.
функция вернет указатель, указывающий на такой указатель, который указывает на начало массива символов, а не на массив указателей.
1
 Аватар для Default_070
26 / 26 / 26
Регистрация: 01.10.2015
Сообщений: 175
03.10.2015, 09:52  [ТС]
Да, как-то не задумался над возвращаемым значением и моим вопросом. Получается я ответил сам не осознавая этого.
0
3 / 1 / 1
Регистрация: 03.10.2015
Сообщений: 11
03.10.2015, 10:18
Цитата Сообщение от daslex Посмотреть сообщение
Цитата Сообщение от freeworker Посмотреть сообщение
Функция вернёт указатель на массив указателей
нефига.
функция вернет указатель, указывающий на такой указатель, который указывает на начало массива символов, а не на массив указателей.
А какой смысл в этом случае создавать указатель на указатель ? Можно было бы обойтись просто указателем.
Хотя делать так никто и не запрещает, но какой в этом смысл?

Добавлено через 15 минут
Если развернуть ответ подробнее то локальные переменные(созданные внутри функции) удаляются из памяти сразу после выхода из функции, то есть сразу после того как функции закончила свою работу. Так как эти переменные создаются в стеке Си или С++. Не путать с аппаратным стеком процессора.
Динамические же переменные создаются в так называемой "куче" (мне не нравится этот термин). И они там будут существовать до тех пор пока программа сама их не удалит, или же до тех пор пока программа не завершит свою работу.
Динамически создавая массив ты имеешь доступ к нему только через указатель, этот указатель единственная вещь которая связывает созданные данные с твоей программой. Если вдруг по ошибке или ещё как, ты переназначишь этот указатель на другой блок данных, то первоначальный блок данных будет потерян. Хотя и останется в памяти до самого завершения работы программы.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.10.2015, 11:13
Цитата Сообщение от freeworker Посмотреть сообщение
А какой смысл в этом случае создавать указатель на указатель ?
Чтобы в такой указатель на указатель присвоить результат, возвращаемый функцией.

Кликните здесь для просмотра всего текста
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
25
26
#include <iostream>
 
 
using namespace std;
 
int* foo(){
     int *x=new int;
     *x=100;
      return x;
      }
 
int** foo2(){
    int **pch=new int*;
    **pch=200;
    return pch;
}
 
    int main()
{
    int **P;
 
    P=foo2(); //Успех
   P=foo();  //Не выйдет, потому что P указатель на указатель.
   cout<<**P;
   delete []P;
}
0
3 / 1 / 1
Регистрация: 03.10.2015
Сообщений: 11
03.10.2015, 11:26
Цитата Сообщение от daslex Посмотреть сообщение
Чтобы в такой указатель на указатель присвоить результат, возвращаемый функцией.
Я же писал уже что в этом случае достаточно простого указателя на массив, а не указатель на указатель.
Разве нет ?
Да и ты сам подтверждаешь это своим примером. Просто надо будет создавать простой указатель, а, не указатель на указатель.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.10.2015, 11:37
В моем примере нет массива.
У ТС есть двумерный массив. Память для него выделяется внутри функции, а очищается вне функции. Чтобы корректно почистить память вне функции, нужно узнать этот адрес вне функции. Чтобы узнать адрес вне функции от массива созданного внутри функции, можно вернуть указатель на начало массива. Вот и верни не указателем на указатель этот адрес из функции.

Добавлено через 3 минуты
Опечатка
Цитата Сообщение от daslex Посмотреть сообщение
delete []P;
delete P;
0
3 / 1 / 1
Регистрация: 03.10.2015
Сообщений: 11
03.10.2015, 11:43
Цитата Сообщение от daslex Посмотреть сообщение
В моем примере нет массива.
Как это соотносится с тем о чём мы спорим
Цитата Сообщение от daslex Посмотреть сообщение
нефига.
функция вернет указатель, указывающий на такой указатель, который указывает на начало массива символов, а не на массив указателей.
Ну, да ладно. Спор ни о чём получился.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.10.2015, 11:57
Указатель на массив указателей
void ***ptr; //с соответствующим выделением памяти.

Массив указателей
void **ptr //с соответствующим выделением памяти.

Указатель
*ptr
0
3 / 1 / 1
Регистрация: 03.10.2015
Сообщений: 11
03.10.2015, 12:34
Это всё понятно.

Для указателя на указатель

это то что нужно было топикстартеру, насколько я понял
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 char **f(int m, int n)
      {
          char **ch;
          ch = new char*[m];// создали массив из m указателей
          for(int i = 0; i < m; i++)
             {
                 ch[i] = new char[n];// создаём строки длиной n
             };
 
          // дальше обращение будет происходить как с обычным двумерным массивом
         // где первый индекс это номер строки
         // а второй это индекс элементов строк   
         ch[0][5] = 'D'; //шестому элементу первой строки присвоили символ D
         return  ch;
      };
И вот то что можно реализовать просто одним указателем
по твоему описанию, где всё будет упаковано в одну длинную строку

C++
1
2
3
4
5
6
char *f(int m)
    {
       char *ch;
       ch = new char[m];
       return ch;
    }

И вся суть спора была в том что если делать так как ты описываешь то двойной указатель не нужен.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
03.10.2015, 12:45

Не по теме:

freeworker, мои претензии к

Цитата Сообщение от freeworker Посмотреть сообщение
Функция вернёт указатель на массив указателей
всё.
_______________
Это не я описываю. Это у ТСа написано так. Я не ТС. он спросил зачем нужно - я показал.



Добавлено через 3 минуты

Не по теме:

Может у него массив слов. Он функцию не показывал.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2015, 12:45
Помогаю со студенческими работами здесь

Что означает данное выражение y%=16
что означает данное выражение y%=16;

Что означает такое выражение?
В книге нашел пример создания объекта класса Distance: Distance&amp; dist = *(new Distance); Без символа &quot;&amp;&quot; работает точно...

Подскажите что означает это выражение
Язык программирования MicroC (для ARM) если что. Ow_Write(&amp;GPIOA_BASE, 3, 0xBE); // Issue command READ_SCRATCHPAD ...

Битовые операции, что означает выражение
что это означает i &amp; (1&lt;&lt;j)?

Что означает выражение стоящее после return?
Всем привет. Довольно часто в уроках по c++. Вижу после написания программы либо функциии. return переменная; Что это значит? ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru