Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость 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);

}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость mihask

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

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

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

Изменено пользователем mihask

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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++} /* инкрементировать адрес */

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость mihask

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

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

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

 

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

Изменено пользователем mihask

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Изменено пользователем unichorn

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость mihask

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

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

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

PS:

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

Device.rar

Изменено пользователем unichorn

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...