Модераторы: 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   Вверх
Kurganec
Дата 28.1.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(WolfAlone @ 28.1.2009,  14:19)
и чё-то там ещё! 

улыбнуло  smile 
PM MAIL ICQ Skype   Вверх
GoldFinch
Дата 28.1.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(WolfAlone @  28.1.2009,  14:19 Найти цитируемый пост)
Я знаю: ..., Pascal, Basic, PHP, ASM немного, и чё-то там ещё! Может быть конечно не на уровне супер-профессионала, но на достаточно высоком уровне.

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


В экстазе
***


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

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



russians, спасибо мил человек, век не забуду! Теперь я вроде как понял, шо такое указатели и для чего они нужны. Думаю, практика быстро исправит сложившееся недоразумение  smile . Кажется теперь я уже въезжаю и в то, что такое ссылки и нахнер нужны они! Ещё раз спасибо! С функциями malloc, calloc, realloc, free, delete/new - я знаком, просто покачто не нашёл им практического применения. Теперь думаю, найду! smile .

Остался ещё небольшой вопрос.

Вот мы выделили 4 (или не 4  smile ) байта памяти:
Код

int *i=new int;

сделали на него указатель... Судя по написанному в руководстве, функция new int - должна была вернуть мне адрес выделенной памяти, а она мне почему-то возвращает TRUE, видимо по тому, что память удалось выделить, при это ещё выдает такое предупреждение.
warning C4800: 'int *' : forcing value to bool 'true' or 'false' (performance warning).

Что я не так сделал?


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

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

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


Эксперт
****


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

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



 smile
PM MAIL Skype GTalk   Вверх
WolfAlone
Дата 28.1.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



GoldFinch, вы совершенно правы! Когда я сдавал зачеты по информатике в школе, ещё на агатах - ни я, ни преподаватели информатики, ни видимо сами АГАТы не слышали про такие структуры как деревья и списки - ничего не слышали! Бывает же такое...  smile 

А вообще, я не утверждаю, что я знаю всё на 5+, но всё выше мною указанное на твёрдое 4 - сдал. В PHP и CSS как ни странно я покачто тоже ничего не слышал про указатели, хотя возможно в них покачто небыло необходимости! Да, и в HTML мне тоже не удалось обнаружить указателей.  smile 


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

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

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



****


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

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



WolfAlone, CSS и HTML - не языки программирования
в PHP есть оператор разыменовывания $, через него там указатели и реализуются

подозреваю что ваши преподаватели информатики и не такое знали, только вам это не говорили ибо бесполезно

в самом деле, почитайте чтонить из теории,  например чтонить типа "алгоритмы и структуры данных" Вирта
PM MAIL ICQ   Вверх
Goliaf777
Дата 28.1.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У нас преподователи информатики в школе 3 года учат как включать компьютер и запускать ворд а остальные годы как выключать компьютер и закрывать ворд. Так что я подумал лучше буду изучать сам чем эти паскали и бейсики,  которые сами преподающие незнают. А вот как посоветовл уважаемый russians тебе стоит почитать С.Прата Язык программирования С++. Лекции и упражнения. Главное понять зачем это нужно, как было сказано выше это позволяет экономить пямять что важно, но не менее важно гибко управлять ею.
PM MAIL ICQ Skype Jabber   Вверх
WolfAlone
  Дата 28.1.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



При всём желании, облазив весь PHP.ru - так и не нашёл, ничего похожего на указатель. Точнее будет сказать, слово указатель там конечно присутствует, но в отличии от С++ - в PHP это абстрактное понятие, и в классическом смысле этого слова их там всё же нет. Но давайте всё-таки вернёмся к теме, ведь разговор не о том, есть ли указатели в php или нет. С указателями я наконец-то разобрался, со ссылками кажется тоже въехал что, куда и зачем. Получилось, как обычно "а ларчик просто открывался"... Всем спасибо, думаю тему можно закрывать!

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

P.S. Люди, будьте друг к другу более снисходительны! Ведь все мы когда-нибудь встретимся в другом мире... По сути дела все мы родились от одной матери, и у нас и без того врагов хватает! Так не будем восставать против братьев своих по разуму и всему остальному!  smile 


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

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

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


Опытный
**


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

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



WolfAlone, указатели обычно используют в следующих случаях:
1. Когда необходимо установить физические связи между отдельными объектами. Например, создать такие структуры как списки, разнообразные деревья и графы без использования указателей довольно сложно.
2. Для доступа к памяти в области "кучи"(heap) можно только через указатели.
3. Для создания массива заранее неизвестного размера:
char* myStr = new char[len];
4. Для изменяемых аргументов функций - хотя чаще используют здесь ссылки, тк проще.
5. Надеюсь ничего особого не забыл...


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
WolfAlone
Дата 28.1.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



pan2004, спасибо огромное! Теперь я знаю не только как их использовать, но и зачем! Думаю, что тему можно закрывать!


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

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

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


Опытный
**


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

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



6. Да и в Сиплюс плюс - для реализации динамического полиморфизма(заумно, но это когда указателю на базовый класс присваивается объект производного класса. Если теперь через этот указатель вызвать виртуальный метод, то он будет вызван у производного класса. Так, одна  функция может, принимая указатель на Base, вызывать методы любого из Derived классов, в зависимости от конкретного типа передаваемого в эту функцию объекта.)


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
GoldFinch
Дата 28.1.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



указатели нужны чтобы хранить адрес куска памяти
вот собственно и все их назначение и применение
PM MAIL ICQ   Вверх
mes
Дата 28.1.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  28.1.2009,  17:55 Найти цитируемый пост)
указатели нужны чтобы хранить адрес куска памяти
вот собственно и все их назначение и применение 

 smile для размышления:
GoldFinch,  адрес куска памяти можно хранить и в int`e. Так зачем тогда указатели ?   smile 


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


Шустрый
*


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

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



mes  Потому-что над указателями дйствует (что весьма важно) другая арифметика,

Добавлено через 1 минуту и 53 секунды
И совсем другие возможности, что в принципе и делает его следующим типом.

Это сообщение отредактировал(а) Goliaf777 - 28.1.2009, 19:24
PM MAIL ICQ Skype Jabber   Вверх
GoldFinch
Дата 28.1.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



mes, я както привык мыслить категориями асма, для меня что "указатель", что int  - все dword

Это сообщение отредактировал(а) GoldFinch - 28.1.2009, 19:32
PM MAIL ICQ   Вверх
mes
Дата 28.1.2009, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(pan2004 @  28.1.2009,  17:44 Найти цитируемый пост)
3. Для создания массива заранее неизвестного размера:
char* myStr = new char[len];

К _созданию_ указатель отношения не имеет.

Цитата(GoldFinch @  28.1.2009,  18:32 Найти цитируемый пост)
mes, я както привык мыслить категориями асма, для меня что "указатель", что int  - все dword

ага, заметно чуть ли в каждой фразе. smile

Добавлено @ 21:09
Цитата(Goliaf777 @  28.1.2009,  18:24 Найти цитируемый пост)
Потому-что над указателями действует (что весьма важно) другая арифметика,

ага,  и эта особенность позволяет им выполнять роль итераторов для обычных (статических и динамических) массивов. 



Это сообщение отредактировал(а) mes - 28.1.2009, 21:21


--------------------
PM MAIL WWW   Вверх
bsa
Дата 29.1.2009, 18:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @ 28.1.2009,  19:32)
mes, я както привык мыслить категориями асма, для меня что "указатель", что int  - все dword

А посмотрю, что ты скажешь, поработав на 64-х битной машине  smile 
PM   Вверх
GoldFinch
Дата 29.1.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



64-х разрядный код все еще неактуален
лет через 5-10 все мирно перейдут на 64-х разрядный код, и то что вы будете называть int'ом я буду называть qword'ом

Добавлено через 6 минут и 8 секунд
кстати, мне что-то кажется что "64-х битная машина" - это неуместное применение термина "бит"
PM MAIL ICQ   Вверх
vinter
Дата 29.1.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(GoldFinch @  29.1.2009,  20:06 Найти цитируемый пост)
64-х разрядный код все еще неактуален

да что вы говорите, как раз таки уже актуален.


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


Эксперт
****


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

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



Цитата(GoldFinch @  29.1.2009,  19:06 Найти цитируемый пост)
64-х разрядный код все еще неактуален
лет через 5-10 все мирно перейдут на 64-х разрядный код, и то что вы будете называть int'ом я буду называть qword'ом

таки давно уже актуален, даже на десктопах smile 
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 29.1.2009, 21:09 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



таки на 99% софт 32-разрядный

Добавлено через 55 секунд
и XP на 99.9% у всех стоит 32-разрядная
PM MAIL ICQ   Вверх
Lazin
Дата 29.1.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @  29.1.2009,  21:09 Найти цитируемый пост)
таки на 99% софт 32-разрядный

нормальный софт не проблема собрать как под x86 так и под IA-64 smile 

Цитата(GoldFinch @  29.1.2009,  21:09 Найти цитируемый пост)
и XP на 99.9% у всех стоит 32-разрядная

у меня 64х smile 
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 29.1.2009, 22:39 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Lazin, а у кого-то фряха.
ну и что? всеравно количество систем с х64 виндой покачто пренебрежимо мало
PM MAIL ICQ   Вверх
Lazin
Дата 29.1.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @  29.1.2009,  22:39 Найти цитируемый пост)
ну и что? всеравно количество систем с х64 виндой покачто пренебрежимо мало 

смотря где, большинство новых компьютеров продаются с 64х битной виндой
если-бы ты писал софт который должен крутиться на серверах а не на десктопах, то тебе пришлось бы лет эдак 6 назад столкнуться с 64х битным кодом smile 
PM MAIL Skype GTalk   Вверх
bsa
Дата 30.1.2009, 13:42 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @ 29.1.2009,  19:06)
64-х разрядный код все еще неактуален
лет через 5-10 все мирно перейдут на 64-х разрядный код, и то что вы будете называть int'ом я буду называть qword'ом

Начнем с того, что не надо ничего называть ни вордом, ни двордом, ни квордом. Так как это источник будущих проблем. Например, мне не известно ни одной 64-х разрядной архитектуры, под которой int имеет размер такой же, как QWORD. Под x86_64 он имеет размер 32 разряда, а вот long, size_t и void* - 64. В то же время, под Win64 у long только 32 разряда.
Именно из-за таких вещей возникает большинство проблем при портировании 32-х разрядного кода на x86_64, так как некоторые несознательные программисты продолжают тупо делать 
Код
int i = 0;
int p = (int)&i;


PM   Вверх
GoldFinch
Дата 30.1.2009, 13:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



bsa, просто сейчас начало переходного периода
когда было время 16-разрядных систем, int был 16-разрядным, а long 32-разрядным
сейчас int 32-разрядный, а long 64-разрядный
все повторяется.

но учитывая сколько времени занял переход с 16-разрядных систем на 32-разрядные, я думаю что полный переход произойдет оочень не скоро
PM MAIL ICQ   Вверх
Lazin
Дата 30.1.2009, 15:03 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @  30.1.2009,  13:54 Найти цитируемый пост)
но учитывая сколько времени занял переход с 16-разрядных систем на 32-разрядные, я думаю что полный переход произойдет оочень не скоро 

с такими программистами да, не скоро smile 
какая разница насколько это распространено, ты для себя пишешь или для заказчика? если для себя то все понятно, но заказчик может захотеть иметь оба билда smile 
PM MAIL Skype GTalk   Вверх
WolfAlone
Дата 30.1.2009, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


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

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



А для .net имеется разница в 32х или 64х разрядный билд?


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

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

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


Эксперт
****


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

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



нет
PM MAIL Skype GTalk   Вверх
bsa
Дата 2.2.2009, 17:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GoldFinch @ 30.1.2009,  13:54)
bsa, просто сейчас начало переходного периода
когда было время 16-разрядных систем, int был 16-разрядным, а long 32-разрядным
сейчас int 32-разрядный, а long 64-разрядный
все повторяется.

но учитывая сколько времени занял переход с 16-разрядных систем на 32-разрядные, я думаю что полный переход произойдет оочень не скоро

Переход уже произошел - уже все наиболее популярные ОС имеют 64-х разрядные варианты. Просто, в отличие от 16->32, этот переход не потребовал радикального изменения операционных систем, поэтому ты ничего и не заметил.
Кстати, простая перекомпиляция программы под 64-х разрядную ОС выявляет много ошибок, которые в 32-х битном режиме из-за ряда "совпадений" ошибками не являлись.
PM   Вверх
NightmareZ
Дата 3.2.2009, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



Цитата(WolfAlone @  28.1.2009,  14:19 Найти цитируемый пост)
Я знаю: javaScript, CSS1/2, HTML4, SQL, Pascal, Basic, PHP, ASM немного, и чё-то там ещё! Может быть конечно не на уровне супер-профессионала, но на достаточно высоком уровне.


Ты либо врёшь, либо ужасно заблуждаешься.

Я думаю, твои познания перечисленных ЯП не выше 1 по пятибальной системе.



--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
Goliaf777
Дата 5.2.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

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

Половина таких книг, что-то из жанра для чайнегов или идиотов толком незнакомят с языком. Чиатал как-то было в самом начале пути книгу, С++ для чайнеков, нечего не понял, хотел уже поконцить с этой затеей. Сейчас с улыбкой вспоминаю как там на 5 страницах (наивно надеясь что-то обьяснить) обьясняли  классы,конструкторы, деструкторы. Поэтому по моему все эти за 21 день, за 24 часа, для чайнеков бурда)))
PM MAIL ICQ Skype Jabber   Вверх
Riddik
Дата 5.2.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прошу пояснить, верно ли утверждение:

  Двумерный массив и указатель на массив - одно и тоже.

Код

int *a[10];      //массив указателей или указатель на указатель
int (*a)[10];   //указатель на массив или двумерный массив


Добавлено через 7 минут и 39 секунд
И 
Код

int **a;

Отличается от 
Код

int *a[10];

только тем, что во втором случае размер матрицы, которая растёт из такой структуры данных, как указатель на указатель сразу задаётся число столбцов (или размер строки, что одно и то же)?

Аналогично объявление двумерного массива (или указателя на массив) 
Код

int (*a)[10];

позволяет варьировать число строк, а не определяет это число заране(int a[5][10];), так? 

Или всё это бред и я ничего не понял?
PM MAIL   Вверх
mes
Дата 5.2.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Riddik @  5.2.2009,  20:52 Найти цитируемый пост)
и я ничего не понял? 

Имхо, Вы не поняли главного, разницу между массивом и указателем.


--------------------
PM MAIL WWW   Вверх
Riddik
Дата 5.2.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Разница такова: 
указатель можно перенаправить, укзатель может указывать в никуда, в то время как массив всегда "намертво" указывает на первый элемент, т.е.  имя массива - это ещё и адрес его нулевого элемента.

Поправьте меня, пожалуйста. В чём ещё отличие указателя от массива? И мой предыдущий пост, где там ошибки?
 

Это сообщение отредактировал(а) Riddik - 5.2.2009, 23:30
PM MAIL   Вверх
bsa
Дата 6.2.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Riddik @ 5.2.2009,  21:52)
Или всё это бред и я ничего не понял?

двумерный массив это именно двумерный массив. То, что существует преобразование к указателю на одномерный массив (размером с количество столбцов двумерного), это еще не значит, что это одно и тоже.
Более того, операция sizeof для массива и указателя возратит в подавляющем большинстве случаев разные значения. Поэкспериментируй.
PM   Вверх
Riddik
Дата 6.2.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

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

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


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

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


 




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


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

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