2015-11-03 2 views
1

Привет я определил следующие функции:C программирование ... Linked List Pointer итерацию

head(); 
traverse(struct *); 

Я обеспокоен тем, что при переборе списка он модифицируется.

void tail() 
{ 
    n3.next = (struct entry*) 0xff; 
} 

void traverse(struct entry *listPt) 
{ 
    while(listPt != (struct entry *) 0xff) 
    { 
     printf("%i\n", listPt->value); 
     listPt = listPt->next; 
    } 
} 

Должен ли я использовать другой алгоритм для перебора списка? Удобнее ли копировать список?

Является ли следующее выражение из цикла while заменено существующей (значениями) памятью?

listPt = listPt->next; 
+1

Почему '0xff' вместо' NULL'? – ShadowRanger

+0

Я хотел посмотреть на значение в gdb. Использование 0xff позволило мне увидеть отличное значение. – dcrearer

ответ

1

Оператор отменяет только локальную переменную listPt объявленную в качестве параметра функции

struct entry *listPt 

Он не модифицирует сам список.

Функциональные параметры являются его локальными переменными. Функция имеет дело с копиями своих аргументов. Любое изменение параметра не влияет на соответствующий аргумент.

Рассмотрим

#include <stdio.h> 

void func(int *p) 
{ 
    int y = 20; 

    p = &y; 

    printf("%d\n", *p); // prints 20 
} 

int main(void) 
{ 
    int x = 10; 
    int *px = &x; 

    printf("%d\n", *px); // prints 10; 

    func(px); 

    printf("%d\n", *px); // prints 10; 
} 
+0

Итак, в C# передача объекта по ссылке на метод распространяется на любой код, содержащий ссылки на этот объект. В чем разница с указателем. Это по сути то же самое, что передать часть памяти, которая ссылается на некоторые данные? – dcrearer

+0

@d_blk Это то же самое, что и передача ссылки на объект в C#. Исходная ссылка iitself, которая передается как аргумент, не будет изменена, но объект, на который ссылается ссылка, будет изменен. –

+0

@d_blk С другой стороны, если передать ссылку по ссылке в C#, которая есть, если соответствующий параметр будет иметь спецификатор ref, тогда также может быть изменено исходное имя ссылки. Оно выглядит так же, как если бы вы передали указатель на указатель на C. Например, void traverse (запись структуры ** listPt); и внутри функции вы изменили значение выражения * listPt –

-2

Нет этот алгоритм хорошо, вы не изменить список. Если вы хотите изменить, вы должны установить заголовок функции следующим образом: void traverse(struct entry * & listPt)

+0

, вы имеете в виду 'void traverse (запись структуры ** listPt)', no? –

+0

Да, прямо в c, но в C++ вы можете использовать & и проще в использовании –