Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > void, struct...


Автор: FrAcTaL_life 22.11.2003, 13:50
Что такое void?
А именно:

Код

// void ставится до функции и может еще быть в параметрах
// зачем он там?

void ShowCout (void)
{
.....
}

// в чем разница если я поставлю перед функцией
// void или int?
//============
//а в параметрах может быть void ничего не означает, а
//является обычным аргументом?


И еще *)..., в чем разница между struct и class?
Вродебы одинаковые вызовы из вне, обращения, передачи аргументов в функции...

Автор: Hroft 22.11.2003, 15:20
void - "никакой" тип. void* - указатель на любой тип.
перед именем функции void означает, что ф-я не фозвращает значения, и в ней не может быть return'а.
получается паскалевская процедура.
если не ошибаюсь, то в новых стандартах не рекомендуется писать void в качестве списка параметров.
нужно просто оставлять скобки пустыми. это от С осталось.
а class и struct различаются: по умолчанию все члены у структуры public, а у класса private. не помню точно, но и наследуются они с модификаторами public у структуры и private у класса. т.е.:
struct s1 {
private:
int x;
};
и
class s2 {
int x;
};
эквивалентны, как и
class s_1 {
public:
int x;
};
и
struct s_2 {
int x;
};

Автор: FrAcTaL_life 22.11.2003, 15:46
1. вот ты (Hroft) написал void*...
А что собственно дает эта звездочка? Есть еще char*

2. в примерах книги (по которой я изучаю с++) перед функцией мелькает int.
на что он указывает? на аргументы(типа все аргументы int)?

Автор: NiJazz 22.11.2003, 17:00
FrAcTaL_life, тут же не школа. Бери книгу и вперёд! Список литературы есть на форуме.

Автор: FrAcTaL_life 22.11.2003, 18:12
NiJazz
В моих книгах это ненаписано, поэтому и спрашиваю!

Автор: NiJazz 22.11.2003, 19:12
FrAcTaL_life, значит у тебя книги не по С++... smile.gif

Автор: NiJazz 22.11.2003, 19:13
FrAcTaL_life, ибо это базовые понятия и они ОБЯЗАНЫ быть в книгах по С++.

Автор: FrAcTaL_life 22.11.2003, 20:21
NiJazz
Извини но ты бы лучше вместо того чтобы попрекать, ответил на вопрос!

А на счет книг...., да не знаю...., написано С++ и мне кабы достачно этого smile.gif


Автор: NiJazz 22.11.2003, 20:51
Звёздочка означает, что эта переменная не является элементом данного типа, а только указателем на значение его. То есть её значение - адрес, по которому расположено значение в памяти. Таким образом можно, зная адрес, можно использовать значение.

void - пустота. Можно понимать это так.

Всё же лучше почитай книгу внимательно... Удачи! ;)

Автор: <Spawn> 23.11.2003, 14:21
Если говорить с точки зрения паскаля, то void* это нетипизированный указатель, т.е. указатель, указывающий на данный любого типа(в Паскале он называется Pointer). Т.е. адрес на который ссылается этот указатель может содержать различные данные - переменную, структуру, адресс функции и т.д. Попросту говоря это есть переменная размером 4 байта(по крайней мере в 32-разрядных ОС), содержащая в себе значение, являющееся адресом переменной, на которую ссылается указатель. Примеры:

Код

 void* p;
 //Выделяем память в 4 байта.
 p = AllocMem(4);
 //Делаем явное приведение типов к int и коссвенно ссылаемся на память, выделенную в предыдущей инструкции, при помощи *. (В Паскале данная операция называется разыменование указателя и обозначается ^)
 *((int*) p) = 10;
 ShowMessage(IntToStr(*((int*) p)));
 //если тебе, например, нужно получить значение младшего байта, то
 ShowMessage(IntToStr(*((char*) p)));
 ...


Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 // Для примера сделаем такую сруктуру
struct Test{
  char a;
  char b;
  char c;
};
Test MyTest;
MyTest.a = 10;
MyTest.b = 20;
MyTest.c = 40;
void* p;
//присваиваем нашему указателю адрес переменной MyTest типа Test
p = &MyTest;

ShowMessage(IntToStr(*((char*) p)));  //Читаем значение MyTest.a
ShowMessage(IntToStr(*((char*) p + 1)));  //Читаем знчение MyTest.b(MyTest.a со смещением в 1 байт)
ShowMessage(IntToStr(*((char*) p + 2)));  //Читаем значение MyTest.c(MyTest.a со смещением в 2 байта)
}


Так же ты можешь увидеть, что некоторые АПИ функции используют нетепизированный указатель для передачи в них адреса функции.
Сори если где ошибся, поскольку Си я учу пару недель и все может быть.

Автор: <Spawn> 23.11.2003, 16:21
Ои, когда читал, то показалось, что был вопрос про void*. Ну ни чего страшного.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)