реклама на сайте
подробности

 
 
> в чем прелесть указателей ?
Abakt
сообщение Jan 29 2007, 05:03
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292



Растолкуйте популярно в чем польза от использования указателей. если возмжно то на примерах. Спасибо.
Go to the top of the page
 
+Quote Post
5 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 14)
arttab
сообщение Jan 29 2007, 05:34
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 29 2007, 06:48
Сообщение #3


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(Abakt @ Jan 29 2007, 08:03) *
Растолкуйте популярно в чем польза от использования указателей. если возмжно то на примерах. Спасибо.


Могу назвать один минус в использовании указателей smile.gif , если с ними не аккуратно работать то
при обработке данных можно легко выйти за пределы обрабатываемого массива и записать данные
в область памяти в которую данная функция записывать данные не должна. Причем компилятор вам об
этом естествено не сообщит. Например вам необходимо записать число 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);
}
В данном случае ошибка с размером массива передаваемого при вызове функции.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jan 29 2007, 08:49
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



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


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 29 2007, 09:19
Сообщение #5


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



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

Сообщение отредактировал mihask - Jan 29 2007, 09:20
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 29 2007, 09:50
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



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

Код
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++} /* инкрементировать адрес */
Лучше, конечно, литературку соответствующую почитать. smile.gif С книжкой то понятнее. Что то типа начальный курс Си и Си++


--------------------
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 29 2007, 10:07
Сообщение #7


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(Abakt @ Jan 29 2007, 08:03) *
Растолкуйте популярно в чем польза от использования указателей. если возмжно то на примерах. Спасибо.


Вообще в Си например, без указателей, помоему довольно сложно программировать когда дело
касается работы со структурами. Да и быстродействие и размер кода в приложениях для
микроконтроллеров иногда имеет значение. А вот например современные языки программирования
java,С# наоборот отказались от указателей для того что бы повысить надежность программ
реализованных на этих языках.
Go to the top of the page
 
+Quote Post
Abakt
сообщение Jan 29 2007, 10:39
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292



друзья, огромное спасибо. пошел тренироваться на "кошках" в смысле на сишках.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 29 2007, 11:20
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(mihask @ Jan 29 2007, 12:19) *
Ну да еще структуру целиком нельзя передать в качестве аргумента функции. Ее можно передать в
функцию только через указатель на структуру.

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 29 2007, 11:38
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dxp @ Jan 29 2007, 15:20) *
Цитата(mihask @ Jan 29 2007, 12:19) *

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

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


--------------------
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 29 2007, 11:45
Сообщение #11


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(dxp @ Jan 29 2007, 14:20) *
Цитата(mihask @ Jan 29 2007, 12:19) *

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

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


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

Сообщение отредактировал mihask - Jan 29 2007, 11:50
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jan 29 2007, 12:10
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



Цитата(prottoss @ Jan 29 2007, 11:38) *
Цитата(dxp @ Jan 29 2007, 15:20) *
Цитата(mihask @ Jan 29 2007, 12:19) *

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

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

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

Сообщение отредактировал unichorn - Jan 29 2007, 12:10
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 29 2007, 12:29
Сообщение #13


Частый гость
**

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(unichorn @ Jan 29 2007, 15:10) *
Цитата(prottoss @ Jan 29 2007, 11:38) *

Цитата(dxp @ Jan 29 2007, 15:20) *
Цитата(mihask @ Jan 29 2007, 12:19) *

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

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

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


Звиняюсь - а здесь можно по подробней ? smile.gif Это ведь получается Объектно - Ориентированное программирование на Си ? Можно наглядный примерчик этой штуки ? smile.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 29 2007, 12:57
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Jan 29 2007, 14:38) *
Цитата(dxp @ Jan 29 2007, 15:20) *
Цитата(mihask @ Jan 29 2007, 12:19) *

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

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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
unichorn
сообщение Jan 29 2007, 13:10
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 24-09-05
Пользователь №: 8 901



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


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

Сообщение отредактировал unichorn - Jan 29 2007, 13:22
Прикрепленные файлы
Прикрепленный файл  Device.rar ( 364.23 килобайт ) Кол-во скачиваний: 73
 
Go to the top of the page
 
+Quote Post

5 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016