Jump to content

    

в чем прелесть указателей ?

Recommended Posts

arttab

Попробуйте почитать и подумать...

А из примеров:

вместо передачи многобайтной переменной можно передать на нее указатель;

в функцию обработки структур или объединений можно передавать указатели на струк. или обьед. или на масивы того или другова....

компилятор при оптимизации переделывает к указателям.

если Вы передаете масив в функцию из, скажем, 300 однобыйтных элементов, то какой буфер потребуется? А Си расценивае как передачу указателя на масив.

Share this post


Link to post
Share on other sites

Guest mihask
Растолкуйте популярно в чем польза от использования указателей. если возмжно то на примерах. Спасибо.

 

Могу назвать один минус в использовании указателей :) , если с ними не аккуратно работать то

при обработке данных можно легко выйти за пределы обрабатываемого массива и записать данные

в область памяти в которую данная функция записывать данные не должна. Причем компилятор вам об

этом естествено не сообщит. Например вам необходимо записать число 0 в массив :

 

int array[5];

 

void FillZero(int* ptr_array, int size_array)

{

while (size_array !=0)

{

 

*ptr_array=0;

ptr_array++;

size_array--;

}

}

 

void main()

{

FillZero(array, 6);

}

В данном случае ошибка с размером массива передаваемого при вызове функции.

Share this post


Link to post
Share on other sites

beer_warrior

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

Share this post


Link to post
Share on other sites

Guest mihask

Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру. Хотя структура помоему и используется в

основном для делания пользовательских типов данных. :)

Edited by mihask

Share this post


Link to post
Share on other sites

prottoss
Растолкуйте популярно в чем польза от использования указателей. если возмжно то на примерах. Спасибо.
Фактически, указатель - это адрес переменной (или функции), и без его использования практически не возможно работать с памятью данных. Вот простой пример:

 

int array[128];

....

for(int i = 0; i < 128; i++){

        array[i] = 0;}   /* адрес начала массива - array, смещение - i */

 

Так вот - переменная array - указатель на массив array[128]. Этот код можно записать и по другому, при этом работать он будет быстрее и размер его будет меньше

 

int array[128];

int * pointer = array;

....

for(int i = 0; i < 128; i++){

        *pointer = 0; /* записать по адресу pointer 0 */

         pointer++} /* инкрементировать адрес */

Лучше, конечно, литературку соответствующую почитать. :) С книжкой то понятнее. Что то типа начальный курс Си и Си++

Share this post


Link to post
Share on other sites

Guest mihask
Растолкуйте популярно в чем польза от использования указателей. если возмжно то на примерах. Спасибо.

 

Вообще в Си например, без указателей, помоему довольно сложно программировать когда дело

касается работы со структурами. Да и быстродействие и размер кода в приложениях для

микроконтроллеров иногда имеет значение. А вот например современные языки программирования

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

реализованных на этих языках.

Share this post


Link to post
Share on other sites

dxp
Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру.

Как это нельзя?! Еще как можно. И передавать, и возвращать. Это массив нельзя передать в качестве аргумента по значению (только указатель - имя массива в этом контексте автоматически перобразовывается к указателю на его первый элемент), а структуру вполне можно.

Share this post


Link to post
Share on other sites

prottoss

Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру.

Как это нельзя?! Еще как можно. И передавать, и возвращать. Это массив нельзя передать в качестве аргумента по значению (только указатель - имя массива в этом контексте автоматически перобразовывается к указателю на его первый элемент), а структуру вполне можно.

И даже массив мона))) Ежели правильна приготовить :)

Share this post


Link to post
Share on other sites

Guest mihask

Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру.

Как это нельзя?! Еще как можно. И передавать, и возвращать. Это массив нельзя передать в качестве аргумента по значению (только указатель - имя массива в этом контексте автоматически перобразовывается к указателю на его первый элемент), а структуру вполне можно.

 

Ой звиняюсь обманул :), но это ограничение все таки было :) правда в очень древних реализациях Си :)

Edited by mihask

Share this post


Link to post
Share on other sites

unichorn

Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру.

Как это нельзя?! Еще как можно. И передавать, и возвращать. Это массив нельзя передать в качестве аргумента по значению (только указатель - имя массива в этом контексте автоматически перобразовывается к указателю на его первый элемент), а структуру вполне можно.

И даже массив мона))) Ежели правильна приготовить :)

А ежели правильно приготовить с указателями на функции, то можно получить и объект который сам

себя будет и обрабатывать. :)

Edited by unichorn

Share this post


Link to post
Share on other sites

Guest mihask

Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру.

Как это нельзя?! Еще как можно. И передавать, и возвращать. Это массив нельзя передать в качестве аргумента по значению (только указатель - имя массива в этом контексте автоматически перобразовывается к указателю на его первый элемент), а структуру вполне можно.

И даже массив мона))) Ежели правильна приготовить :)

А ежели правильно приготовить с указателями на функции, то можно получить и объект который сам

себя будет и обрабатывать. :)

 

Звиняюсь - а здесь можно по подробней ? :) Это ведь получается Объектно - Ориентированное программирование на Си ? Можно наглядный примерчик этой штуки ? :)

Share this post


Link to post
Share on other sites

dxp

Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в

функцию только через указатель на структуру.

Как это нельзя?! Еще как можно. И передавать, и возвращать. Это массив нельзя передать в качестве аргумента по значению (только указатель - имя массива в этом контексте автоматически перобразовывается к указателю на его первый элемент), а структуру вполне можно.

И даже массив мона))) Ежели правильна приготовить :)

Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?

Share this post


Link to post
Share on other sites

unichorn

Примерчик можно, сам проэкт сдох чёрт знает когда, поэтому коммерческой ценности непредставляет (и соответственно недаделан).

Правда он под семейство MCU51(Keil2), но для понятия сути вещей сгодится.

 

 

PS:

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

Device.rar

Edited by unichorn

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.