Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
26 / 26 / 26
Регистрация: 01.10.2015
Сообщений: 175
1

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

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

C++
1
2
3
4
char** SomeFunction(int num, int num1)
{
    // some code
}
Мне не понятно зачем здесь указатели? может кто подскажет. Если, что внутри функции выполняется выделение памяти под двумерный массив знаков(букв) и возвращается сам массив.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2015, 09:28
Ответы с готовыми решениями:

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

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

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

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

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

Решение

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

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

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

Добавлено через 15 минут
Если развернуть ответ подробнее то локальные переменные(созданные внутри функции) удаляются из памяти сразу после выхода из функции, то есть сразу после того как функции закончила свою работу. Так как эти переменные создаются в стеке Си или С++. Не путать с аппаратным стеком процессора.
Динамические же переменные создаются в так называемой "куче" (мне не нравится этот термин). И они там будут существовать до тех пор пока программа сама их не удалит, или же до тех пор пока программа не завершит свою работу.
Динамически создавая массив ты имеешь доступ к нему только через указатель, этот указатель единственная вещь которая связывает созданные данные с твоей программой. Если вдруг по ошибке или ещё как, ты переназначишь этот указатель на другой блок данных, то первоначальный блок данных будет потерян. Хотя и останется в памяти до самого завершения работы программы.
0
1367 / 590 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
03.10.2015, 11:13 8
Цитата Сообщение от 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 9
Цитата Сообщение от daslex Посмотреть сообщение
Чтобы в такой указатель на указатель присвоить результат, возвращаемый функцией.
Я же писал уже что в этом случае достаточно простого указателя на массив, а не указатель на указатель.
Разве нет ?
Да и ты сам подтверждаешь это своим примером. Просто надо будет создавать простой указатель, а, не указатель на указатель.
0
1367 / 590 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
03.10.2015, 11:37 10
В моем примере нет массива.
У ТС есть двумерный массив. Память для него выделяется внутри функции, а очищается вне функции. Чтобы корректно почистить память вне функции, нужно узнать этот адрес вне функции. Чтобы узнать адрес вне функции от массива созданного внутри функции, можно вернуть указатель на начало массива. Вот и верни не указателем на указатель этот адрес из функции.

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

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

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

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

это то что нужно было топикстартеру, насколько я понял
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
1367 / 590 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
03.10.2015, 12:45 14

Не по теме:

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

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



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

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2015, 12:45

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

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

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

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


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

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

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