Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Указатели


Автор: WolfAlone 28.1.2009, 11:12
Добрый день! Объясните пожалуйста принципиальное отличие строки 1 и строки 2
Код

int *a;
int* b;


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

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

это прикол?

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

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

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

читай книги

Автор: Lazin 28.1.2009, 11:23
user posted image

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

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

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

 smile  повышай самооценку камрад. почитай что нибудь по цивильнее  smile 

Автор: taiven 28.1.2009, 12:35
Цитата

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

Код

#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;


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

забудь про С++ и читай про теорию программирования, в частности про структуры данных и подпрограммы

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

Автор: Lazin 28.1.2009, 12:49
может не твое?

Добавлено через 45 секунд
зачем нам пересказывать то, что написано во всех учебниках, возьми нормальный учебник и почитай

Автор: GoldFinch 28.1.2009, 14:04
если ты знаеш асм, то вообще непонятно как у тя может возникнуть вопрос об указателях %)

Автор: ZeroPoint 28.1.2009, 14:15
Вначале был Указатель. 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;
}


Автор: russians 28.1.2009, 14:19
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

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

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


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

Спасибо!

Автор: russians 28.1.2009, 14:31
Цитата

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. А нахрена тебе С++, если тебе нужны указатели? Указатель - это низкоуровневая работа с памятью, это С.

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

улыбнуло  smile 

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

на крайне низком уровне ты их знаешь, и само программирование тоже
подозреваю что такие структуры как списки и деревья, которые обычно реализуются через указатели, тебе неизвестны

Автор: WolfAlone 28.1.2009, 16:32
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).

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

Автор: Lazin 28.1.2009, 16:36
 smile

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

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

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

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

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

Автор: Goliaf777 28.1.2009, 17:46
У нас преподователи информатики в школе 3 года учат как включать компьютер и запускать ворд а остальные годы как выключать компьютер и закрывать ворд. Так что я подумал лучше буду изучать сам чем эти паскали и бейсики,  которые сами преподающие незнают. А вот как посоветовл уважаемый russians тебе стоит почитать С.Прата Язык программирования С++. Лекции и упражнения. Главное понять зачем это нужно, как было сказано выше это позволяет экономить пямять что важно, но не менее важно гибко управлять ею.

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

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

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

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

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

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

Автор: GoldFinch 28.1.2009, 18:55
указатели нужны чтобы хранить адрес куска памяти
вот собственно и все их назначение и применение

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

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

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

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

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

Автор: mes 28.1.2009, 21:03
Цитата(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 Найти цитируемый пост)
Потому-что над указателями действует (что весьма важно) другая арифметика,

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


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

А посмотрю, что ты скажешь, поработав на 64-х битной машине  smile 

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

Добавлено через 6 минут и 8 секунд
кстати, мне что-то кажется что "64-х битная машина" - это неуместное применение термина "бит"

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

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

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

таки давно уже актуален, даже на десктопах smile 

Автор: GoldFinch 29.1.2009, 21:09
таки на 99% софт 32-разрядный

Добавлено через 55 секунд
и XP на 99.9% у всех стоит 32-разрядная

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

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

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

у меня 64х smile 

Автор: GoldFinch 29.1.2009, 22:39
Lazin, а у кого-то фряха.
ну и что? всеравно количество систем с х64 виндой покачто пренебрежимо мало

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

смотря где, большинство новых компьютеров продаются с 64х битной виндой
если-бы ты писал софт который должен крутиться на серверах а не на десктопах, то тебе пришлось бы лет эдак 6 назад столкнуться с 64х битным кодом smile 

Автор: bsa 30.1.2009, 13:42
Цитата(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;


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

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

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

с такими программистами да, не скоро smile 
какая разница насколько это распространено, ты для себя пишешь или для заказчика? если для себя то все понятно, но заказчик может захотеть иметь оба билда smile 

Автор: WolfAlone 30.1.2009, 18:55
А для .net имеется разница в 32х или 64х разрядный билд?

Автор: Lazin 30.1.2009, 21:51
нет

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

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

Переход уже произошел - уже все наиболее популярные ОС имеют 64-х разрядные варианты. Просто, в отличие от 16->32, этот переход не потребовал радикального изменения операционных систем, поэтому ты ничего и не заметил.
Кстати, простая перекомпиляция программы под 64-х разрядную ОС выявляет много ошибок, которые в 32-х битном режиме из-за ряда "совпадений" ошибками не являлись.

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


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

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

Автор: Goliaf777 5.2.2009, 21:24
Цитата

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

Половина таких книг, что-то из жанра для чайнегов или идиотов толком незнакомят с языком. Чиатал как-то было в самом начале пути книгу, С++ для чайнеков, нечего не понял, хотел уже поконцить с этой затеей. Сейчас с улыбкой вспоминаю как там на 5 страницах (наивно надеясь что-то обьяснить) обьясняли  классы,конструкторы, деструкторы. Поэтому по моему все эти за 21 день, за 24 часа, для чайнеков бурда)))

Автор: Riddik 5.2.2009, 21:52
Прошу пояснить, верно ли утверждение:

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

Код

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


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

int **a;

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

int *a[10];

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

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

int (*a)[10];

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

Или всё это бред и я ничего не понял?

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

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

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

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

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

двумерный массив это именно двумерный массив. То, что существует преобразование к указателю на одномерный массив (размером с количество столбцов двумерного), это еще не значит, что это одно и тоже.
Более того, операция sizeof для массива и указателя возратит в подавляющем большинстве случаев разные значения. Поэкспериментируй.

Автор: Riddik 6.2.2009, 13:57
Спасибо))

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