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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели 
:(
    Опции темы
WolfAlone
Дата 28.1.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



Добрый день! Объясните пожалуйста принципиальное отличие строки 1 и строки 2
Код

int *a;
int* b;


Ещё очень хотелось бы узнать, в каких практических случаях применяются указатели, и ссылки. Спасибо!


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
mrbrooks
Дата 28.1.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(WolfAlone @  28.1.2009,  11:12 Найти цитируемый пост)
Добрый день! Объясните пожалуйста принципиальное отличие строки 1 и строки 2
Выделить всёкод C++
1:
2:
    
int *a;
int* b;

это прикол?
PM MAIL   Вверх
vinter
Дата 28.1.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(WolfAlone @  28.1.2009,  12:12 Найти цитируемый пост)
Добрый день! Объясните пожалуйста принципиальное отличие строки 1 и строки 2

никакого, только стиль написания

Цитата(WolfAlone @  28.1.2009,  12:12 Найти цитируемый пост)
Ещё очень хотелось бы узнать, в каких практических случаях применяются указатели, и ссылки. Спасибо!

читай книги


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 28.1.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



user posted image
PM MAIL Skype GTalk   Вверх
WolfAlone
Дата 28.1.2009, 11:28 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



vinter, спасибо огромное! С написанием разобрался окончательно.
Вопрос про практическое применение указателей, до сих пор открыт... Так же интересуют ссылки.

P.S. Читаю 8ой раз "Руководства идиота по С++", никак не могу въехать в практику их применения...


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
mrbrooks
Дата 28.1.2009, 11:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(WolfAlone @  28.1.2009,  11:28 Найти цитируемый пост)
P.S. Читаю 8ой раз "Руководства идиота по С++"

 smile  повышай самооценку камрад. почитай что нибудь по цивильнее  smile 
PM MAIL   Вверх
taiven
Дата 28.1.2009, 12:35 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Вопрос про практическое применение указателей, до сих пор открыт...

Код

#include <iostream>
 
void func_p(int *x){ *x = 100; }
void func(int x) { x = 100;    }

int main()
{
    int y = 1;

    func(y);
    std::cout << y << '\n';

    func_p(&y);
    std::cout << y << '\n';
 
    return 0;
}

ну и ещё
Код

int *p = new int[10];
delete[] p;



Это сообщение отредактировал(а) taiven - 28.1.2009, 12:36
PM   Вверх
GoldFinch
Дата 28.1.2009, 12:42 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(WolfAlone @  28.1.2009,  11:28 Найти цитируемый пост)
опрос про практическое применение указателей, до сих пор открыт...

забудь про С++ и читай про теорию программирования, в частности про структуры данных и подпрограммы
PM MAIL ICQ   Вверх
WolfAlone
Дата 28.1.2009, 12:47 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



Объясните мне кто-нибудь человеческим языком, код написанный выше? Что, куда и зачем... Я уже примерно 7ой раз пытаюсь начать учить С++, и всё упирается именно в эти указатели и ссылки! Даже ассмблер мне так туго не давался, как С++!!! Уже в этом году будет уже наверное 6ой год, как я хочу начать его учить, и ... 


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Lazin
Дата 28.1.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



может не твое?

Добавлено через 45 секунд
зачем нам пересказывать то, что написано во всех учебниках, возьми нормальный учебник и почитай
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 28.1.2009, 14:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



если ты знаеш асм, то вообще непонятно как у тя может возникнуть вопрос об указателях %)
PM MAIL ICQ   Вверх
ZeroPoint
Дата 28.1.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вначале был Указатель. smile
Тут немного кода с комментариями, для начала хватит.

Код

#include <stdio.h> // Для printf()
#include <conio.h> // Для getch()

#pragma warning ( disable : 4996 ) // Выключим сомнительное предупреждение компилятора.

// Обьявляем функции, которые будут описаны ниже.
void FnVar( int iVar );
void FnRef( int& iVar );
void FnPtr( int* iVar );

// Обьявляем указатель на функцию, тип указателя соответствует 3й из обьявленных выше функций.
void (*PtrToFn)( int* iVal );

// Полезно применять, т.к. изменение количества переменных массива делается 1 раз здесь.
#define _My_b_Vals_Max_Data 5 

// Для удобства и лучшей читаемости кода
#define _My_PRESS_ANY_KEY printf( "\nProgram done.\nPress any key.\n" );getch();

int main()
{
    int* a;
    int *b; // Обьявления ни чем не отличаются кроме, конечно, имен переменных. :-)

    // Объявляем и присваиваем значения переменной и массиву типа int.
    int i_a_Val = 5;
    int i_b_Vals[_My_b_Vals_Max_Data] = {0,};

    a = &i_a_Val; // Берем адрес переменной.

    printf( "%d\n", i_a_Val );

    // *a++; // Это смещение на 1-цу позиции указателя, вполне применимо к массивам, см. ниже.

    (*a)++;    // Инкрементируем значение переменной по адресу в указателе a.

    printf( "%d\n", i_a_Val );

    b = i_b_Vals;    // Имя массива - тот же указатель.

    printf( "%p\n", b ); // Выводим адрес по которому расположен массив.

    b = &i_b_Vals[0]; // Берем адрес первого элемента массива.

    printf( "%p\n", b ); // Он тот же, что и адрес массива.

    b[2] = 5; // Изменяем значение 3-го ( 2 - индекс, считается с 0 (!)) элемента массива, обращаясь к указателю как к массиву.

    *(b + 3) = 10; // Изменяем значение 4-го элемента массива, по адресу в указателе смещенному на позицию этого элемента.

    for( int i = 0; i < _My_b_Vals_Max_Data; i++ )
        printf( "%d ", i_b_Vals[i] ); // Выводим значения массива.

    printf( "\n" );

    FnVar( i_a_Val ); 
    // Переменная не изменится, т.к. в функции используется ее копия (хранится в стэке вызова).
    // Все изменения копии переменной имеют смысл только внутри этой ф-ии.

    printf( "%d\n", i_a_Val );

    FnRef( i_a_Val );
    // Пременная примет значение 20, т.к. компилятор "знает", что работать нужно через адрес реальной переменной (ссылка).

    printf( "%d\n", i_a_Val );

    FnPtr( &i_a_Val );
    // Пременная примет значение 30, т.к. прямо указан адрес в памяти, где расположено значение переменной.

    printf( "%d\n", i_a_Val );

    i_a_Val = 0; // Обнулим переменную для следующего примера.

    printf( "%d\n", i_a_Val );

    // Берем адрес функции, это полезно, например, при прямом импорте одинаковых по типу функций из разных DLL.
    PtrToFn = &FnPtr;

    PtrToFn( &i_a_Val ); // Результат такой же, что и в предыдущем случае.
    
    printf( "%d\n", i_a_Val );

    void* pPrt = NULL; // Пустой указатель, основа всех указателей, аппаратный указатель. Может быть приведен к любому типу указателя.

    pPrt = a;
    pPrt = b;
    pPrt = &b[2];
    pPrt = PtrToFn;
    pPrt = &main;
    pPrt = &printf;
    pPrt = "Void pointer";

    // Но при его использовании нужно точно "сказать" компилятору, как его применить. 
    // Если нет крайней необходимости, лучше не использовать.
    printf( "%s\n", (char*) pPrt );

    _My_PRESS_ANY_KEY

    return 0;
}

void FnVar( int iVar )
{
    iVar = 10;
}

void FnRef( int& iVar )
{
    iVar = 20;
}

void FnPtr( int* iVar )
{
    (*iVar) = 30;
}


PM MAIL   Вверх
russians
Дата 28.1.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



WolfAlone

Код

#include <iostream> // команда препроцессора, включаем содержимое iostream.h в код из стандартной, по 
// мнению системы или IDE, директории с библиотеками.
 
void func_p(int *x){ *x = 100; } // объявляем функцию, принимающую аргумент-указатель x не возвращающую 
// ничего, внутри функции в x (x - адрес, *x - значение по адресу) кладём 100 в десятичной системе счисления :)
void func(int x) { x = 100;    } // объявляем функцию, принимающую аргумент-целое число, в теле которой присваиваем x 100.
int main() // объявляем main функцию, возвращающую integer (return 0)
{
    int y = 1; // присваиваем y целое значение
    func(y); // передаём функции значение y
    std::cout << y << '\n'; // выводим
    func_p(&y); // передаём функции адрес y ( y - значение, &y - адрес расположения переменной в памяти), в 
// теле функции получаем значение по адресу *(&y) 
    std::cout << y << '\n'; // выводим 
 
    return 0; // возвращаем 0 в систему
}


Всё smile

Это сообщение отредактировал(а) russians - 28.1.2009, 14:22
PM MAIL   Вверх
WolfAlone
Дата 28.1.2009, 14:19 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



Я знаю: javaScript, CSS1/2, HTML4, SQL, Pascal, Basic, PHP, ASM немного, и чё-то там ещё! Может быть конечно не на уровне супер-профессионала, но на достаточно высоком уровне.

Такое понятие как указатели - в Pascal'e я использовал только для выделения буферов при работе с файлами, в других случаях обходился обычными переменными. Про ссылки, я ничего ни в PHP, ни в Pascal'e не слышал. Что такое структуры я знаю хорошо, т.к. писал чью-то курсовую, в которой нужно было на паскале соорудить примитивный движек для БД, за основу которого я взял именно структуры.


Lazin, после вышесказанного, я всё же смею надеяться, что изучение C++, мне всё таки начнёт удаваться. Главное, что бы кто-нибудь обычным человеческим языком мне растолковал, какое практическое применение у указателей и ссылок! Для чего их применяют и как? Так как из "сухих" книжных понятий мне нихрена не ясно.

Спасибо!


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
russians
Дата 28.1.2009, 14:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Lazin, после вышесказанного, я всё же смею надеяться, что изучение C++, мне всё таки начнёт удаваться. Главное, что бы кто-нибудь обычным человеческим языком мне растолковал, какое практическое применение у указателей и ссылок! Для чего их применяют и как? Так как из "сухих" книжных понятий мне нихрена не ясно.

А ты не торопись, возьми Стивена Прата С. С++ тебе пока рано, надо понять сначала его кровного старого собрата, из которого потом С++ родился.
Почитай его спокойненько - поймёшь smile 
А дальше - усложняй себе задачу по мере прихода понимания smile

Указатель хорош тем, что вместо того, чтобы передавать в функции значения и создавать дополнительные, нафиг никому не нужные локальные переменные, которые жрут место в памяти, мы можем передать в неё указатель, а указатель это всего лишь переменная, которая хранит адрес в памяти (по сути int - по длине), и которую ты можешь разыменовать, т.е. достать значение по адресу с помощью оператора *.

Есть у нас массив int  x = {1, 2, 3, 4};
И есть у нас переменная int * i = x (в С имя массива - это ссылка на первый элемент массива).

Так гораздо легче для памяти, когда мы передаём этот мааааленький указатель и обращаемся к нему:
*(i + h), где h - это смещение типа int относительно начального указателя, разыменовывая по очереди элементы относительно первого, на который указывает указатель, чем когда мы передаём весь массив.

И когда мы подставляем имя массива в функцию, тем самым мы передаём указатель на первый элемент её.

Ещё тебе указатели понадобятся, когда ты узнаешь, что такое malloc, calloc, realloc, free и new/delete (динамическое размещение элементов данных в памяти прямо на ходу выполнения приложения, а не в момент компиляции).
И когда ты будешь изучать сложные структуры данных (списки, деревья, стеки, очереди, графы), то тебе указатели пригодятся для связок предыдущих и следующих элементов.

Вот, вроде бы объяснил.
Поправляйте, если что smile

P.S. А нахрена тебе С++, если тебе нужны указатели? Указатель - это низкоуровневая работа с памятью, это С.

Это сообщение отредактировал(а) russians - 28.1.2009, 14:38
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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