Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели, строки, классы и пр. Си++ новичкам посвящается... 
V
    Опции темы
UnrealMan
Дата 16.10.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 5
Всего: 32



Цитата(J0ker @  14.10.2008,  04:11 Найти цитируемый пост)
можно так

Проще так:

Код
p = new int[1][10];

PM MAIL   Вверх
boombasta
Дата 30.10.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



привет всем!

что-то немогу найти ответов на 2 моих вопроса:
1. че отличается 
Код
CoreInterface* _core;

от
Код
CoreInterface *_core;


2. что здесь написано:
Код
getObject = (PluginInterface*(*)(CoreInterface*)) lib->resolve("getObject");

что за конструкция такая PluginInterface*(*)??

3. и здесь 
Код
PluginInterface* (*getObject)(CoreInterface*);

тут типа обьявление переменной getObject но не понятно что за (CoreInterface*)?

З.Ы. PluginInterface и CoreInterface - это классы
PM MAIL   Вверх
bsa
Дата 30.10.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



1. ничем не отличается.
2 и 3. Это тип указателя на функцию, которая принимает указатель на CoreInterface и возвращает указатель на PluginInterface. Соответственно, PluginInterface* (*getObject)(CoreInterface*) - это указатель на функцию.

Я, например, всегда делаю так, чтобы не вводить никого в замешательство:
Код
typedef PluginInterface* (*GetObjectProcPtr)(CoreInterface*); //создаем новый тип "указатель на функцию"
GetObjectProcPtr getObject; //определяем указатель этого типа

PM   Вверх
boombasta
Дата 30.10.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.10.2008

Репутация: нет
Всего: нет



Код
PluginInterface* (*getObject)(CoreInterface*);    
getObject = (PluginInterface*(*)(CoreInterface*)) lib->resolve("getObject");

со строкой 1 понятно (спсб bsa ;)) обьявляется указательна функцию, которая в качестве аргумента принимает указатель на CoreInterface, а возвращает указатель на PluginInterface.

а что происходит в строке 2?
насколько я понимаю lib->resolve("getObject") возвражает ссылку на функцию?
а что такое вот это: (PluginInterface*(*)(CoreInterface*)) ? - это жжет мне мозг  smile  как-то это можно переписать по проще - пусть больше строк, но как-то понятнее smile (или хотябы просто по-другому, может так будет понятнее smile)

дольше по тексту getObject юзается как обычная функция:
PluginInterface* getObject(CoreInterface*);
PM MAIL   Вверх
bsa
Дата 30.10.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(boombasta @ 30.10.2008,  17:30)
а что такое вот это: (PluginInterface*(*)(CoreInterface*)) ? - это жжет мне мозг  smile

Это преобразование к типу "указатель на функцию" - PluginInterface* (*)(CoreInterface*).
Что делать для того, чтобы было понятно я показал:
Код
typedef PluginInterface* (*GetObjectProcPtr)(CoreInterface*); //создаем новый тип "указатель на функцию"
GetObjectProcPtr getObject; //определяем указатель этого типа
getObject = (GetObjectProcPtr) lib->resolve("getObject");


Вообще-то обобщенно тип "указатель на функцию" выглядит так: <return_type> (*)(<arg1_type>, <arg2_type>, ...)
Сам указатель (переменная типа "указатель на функцию") определяется так: <return_type> (*<var_name>)(<arg1_type>, <arg2_type>, ...)

P.S.: почитай книжку для начинающих
PM   Вверх
Goliaf777
Дата 2.12.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



Вопрос.Почему нужно  using namespace std если в приводимых кодах на форуме пишется std::cout.Объясните ЧаЙнИгУ!!))) smile 
PM MAIL ICQ Skype Jabber   Вверх
bsa
Дата 2.12.2008, 20:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Goliaf777 @ 2.12.2008,  17:14)
Вопрос.Почему нужно  using namespace std если в приводимых кодах на форуме пишется std::cout.Объясните ЧаЙнИгУ!!))) smile

по-хорошему, надо писать std::cout, std::cin, std::cerr, std::endl... Но если тебе лень и пишешь маленькую программу, которую не собираешься в дальнейшем улучшать, то можно написать после всех инклюдов using namespace std, и это избавит тебя от необходимости писать приставку std::. Если у тебя нет желания писать std, но не хочется глобально раскрывать стандартное пространство имен, то можешь использовать using namespace std внутри функции (точнее, внутри почти любых операторных скобок). Как вариант, можно раскрыть только необходимые элементы пространства имен:
Код
using std::cout;
using std::endl;
После этого можно использовать cout и endl без указания std::.
PM   Вверх
Goliaf777
Дата 2.12.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



Огромное спасибо!!! smile 
PM MAIL ICQ Skype Jabber   Вверх
XeS
Дата 20.4.2009, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 6.4.2008

Репутация: нет
Всего: нет



Помогите разобраться, почему не меняеться адрес переменной, допустим есть такой код:

Код

void f(int* b)
{
      int* i = new int;
      
      *i = 321;

      b = i;
}

int main()
{
       int* a = new int;
       
       *a = 123;
      
       f(a);

       printf("%a", *a);

}


на экране будет 123, а не 321, а если я перепешу код вот так то все будет норм:

Код

void f(int** b)
{
      int* i = new int;
      
      *i = 321;

      *b = i;
}

int main()
{
       int* a = new int;
       
       *a = 123;
      
       f(&a);

       printf("%a", *a);

}


с чем это связано и почему? smile

и второй вопрос:

пусть у меня есть переменные такого типа:

int*** a;
int* b;

что бы привести b к типу a, я должен сделать такое:

int*** a;
int** c;
int* b;

c = &b;
a = &c;

можно ли это сделать по другому, что-бы меньше писать? smile
PM MAIL   Вверх
bsa
Дата 21.4.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



XeS
Код
void f(int* b) //b - копия это указателя, который ты передаешь в качестве аргумента
{
      int* i = new int;
      *i = 321;
      b = i;
}
Чтобы можно было изменить аргумент, то нужно сделать b ссылкой:
Код
void f(int* &b) //только для С++!
{
      int* i = new int;
      *i = 321;
      b = i;
}
или так:
Код
void f(int* *b) //вызывать надо так: int *a = new int; f(&a);
{
      int* i = new int;
      *i = 321;
      *b = i;
}
Цитата(XeS)
пусть у меня есть переменные такого типа:

int*** a;
int* b;

что бы привести b к типу a...
По хорошему, не нужно приводить b к типу a! Но если так неймется, то только тем способом, что сам ты и написал. Только это не приведением "типов". Потому что фактически ты не передаешь значение b. Ты передаешь указатель на переменную, которая кодержит указатель на b;
Обычно, такие конструкции можно встретить в качестве параметров функций (когда функция может изменить значение аргумента) или для определения многомерных динамических массивов.

Это сообщение отредактировал(а) bsa - 21.4.2009, 13:15
PM   Вверх
master123
Дата 1.5.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 13.4.2009

Репутация: нет
Всего: нет



Спс... Мне помогло
________________________________
http://linecinema.ru/

Это сообщение отредактировал(а) master123 - 1.5.2009, 20:10
PM MAIL   Вверх
XAKERs89
Дата 26.8.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.8.2009

Репутация: нет
Всего: нет



можно ли создать массив структур с помощью указателей?
Код

struct date *y=new struct date[3];
 

Это сообщение отредактировал(а) XAKERs89 - 26.8.2009, 21:13
PM MAIL   Вверх
andrew_121
Дата 26.8.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



XAKERs89, Ссылок? Или указателей?
Уточните вопрос.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
XAKERs89
Дата 26.8.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.8.2009

Репутация: нет
Всего: нет



оЙ..сори запутался (((  указателей
PM MAIL   Вверх
andrew_121
Дата 26.8.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Код

struct date **y=new struct date*[3];




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Страницы: (6) Все « Первая ... 2 3 [4] 5 6 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0939 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.