Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Снова указатели 
V
    Опции темы
ConverterDU
Дата 25.2.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Уважаемые программисты, помогите мне пожалуйста! Вот программа, которую я опять таки сделал кое как с моим руководителем! 
Программа создает список из трех элементов и печатает его. Есть функция создания новон=го элемента в конце списка. 
Я не понимаю некоторые строки программы, так скажем! Про указатели я все вроде бы понимаю! Я прочитал все, что естьна вашем 
форуме и не толбко, суть ясна. Но я не понимаю, зачем он нужен на примере вот конкретной программы. Вот объявил я указатель, 
который указывает на область памяти типа int и имеет адрес 0х11111(чтоб легче различать)...и сделал указатель на этот указатель. Получается во втором указателе будет записан адрес первого 0х11111, 
а его собственный, к примеру, 0x22222.....так получается или нет?!
Остальные вопросы ниже напротив строк:
Код



#include<stdio.h>
#include<stdlib.h>

typedef struct List_t {   
    float L_element; 
    struct List_t *next; // объявили указатель next 
} List_t ;

void List_Prepend(List_t **next, float elem) { // здесь у нас уже указатель на указатель объявлен, так?
    
    List_t *Knoten = (List_t *)malloc(sizeof(List_t));
    Knoten->L_element = elem;
    Knoten->next = *next; // тогда что значит вот эта операция? я по адресу на кот указывает next записал адрес второго указателя?
    *next = (Knoten);       
}

void List_Append(List_t **pLis, float elem) {
    printf("pLis = %p\n", pLis);
    while(*pLis != NULL) {
        printf("Ende noch nicht erreicht, Eintrag bei %p\n", *pLis);
        pLis = &((*pLis)->next);        
    }
    List_t *newNode = (List_t *)malloc(sizeof(List_t));
    printf("Neuer Eintrag angelegt bei %p\n", newNode);
    newNode->L_element = elem;
    newNode->next = NULL;// или вот здесь, я получается по адресу на кот указывает указатель записал 0?
    *pLis = newNode;
        
}

void List_Print (List_t *head) {
    List_t *r = head;
    int j = 1;
     while(r != NULL) {
        printf("\n Element %d ist gleich %2.0f ", j++, r->L_element);
        r = r->next;
    }
}
int main(){
    List_t *list = NULL;
    List_Append(&list, 5);
    List_Append(&list, 10);
    List_Append(&list, 30);
    List_Print(list);        
}


Зачем все это нужно то? Чтобы я мог в каждой функции его изменять отдельно или как?
Прошу, потратьте на меня немного своего времени и помогите разобраться с этим, наконец! Заранее спасибо!


Это сообщение отредактировал(а) ConverterDU - 25.2.2011, 13:31
PM MAIL   Вверх
borisbn
Дата 25.2.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



попробуй (только для уяснения) создать тип
Код

typedef List_t* PList_t;

и везде, где увидишь List_t* (с одной звездой) заменить его на PList_t
потом посмотри внимательно на то, что получилось, и... думаю будет яснее...

я лично так врубался в указатели на указатели

Это сообщение отредактировал(а) borisbn - 25.2.2011, 15:38


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ConverterDU
Дата 25.2.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ну вы же так все хорошо это понимаете, объясните полно, плз!
PM MAIL   Вверх
bsa
Дата 25.2.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ConverterDU, чтобы функция могла поменять указатель, который передается ей в качестве параметра необходимо передавать адрес этого указателя. Это и есть одна из сфер использования указателей на указатель.
Есть еще одна сфера - массивы динамических массивов или просто динамически выделяемых данных.
PM   Вверх
borisbn
Дата 25.2.2011, 17:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ConverterDU, смотри. В таком коде вопросов нет ?
Код

void fill_int_by_5( int * pointer_to_int ) {
    *pointer_to_int = 5;
}

int x;
fill_int_by_5( & x );


тогда и в таком не должно быть
Код

void fill_pointer_to_new_mem( int ** pointer_to_pointer_to_int ) {
    *pointer_to_pointer_to_int = (int*)malloc( 1000 );
}

int * some_pointer = NULL;
void fill_pointer_to_new_mem( & some_pointer );


давай заменим в первом коде int на некий T
Код

typedef int T;
void fill( T * p ) {
    *p = 5;
}

T x;
fill( & x );


теперь давай во втором коде заменим int * на PT
Код

typedef int * PT;
void fill( PT * p ) {
    *p = (PT)malloc( 1000 );
}

PT x;
fill( & x );


как видишь, теперь между этими вариантами нет никакой разницы, ну, за исключением того, что в 1-м варианте fill записывает в результат целое число, а во 2-м - указатель, т.е. рез-т работы ф-ции malloc


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ConverterDU
Дата 27.2.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, спасибо!

borisbn, спасибо огроменное, мне теперь с указателями, по сути, все понятно стало! что бы я без тебя делал!! Круто!! smile 
PM MAIL   Вверх
bsa
Дата 27.2.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




M
bsa
ConverterDU, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
ConverterDU
  Дата 1.3.2011, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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

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

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


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

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


 




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


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

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