Member 13188016 Ответов: 4

Разница между значением указателя, адресом указателя, переменной указателя


первый код:
void Push(struct node** headRef, int data) {
struct node* newNode = malloc(sizeof(struct node));
newNode->data = data;
newNode->next = *headRef; // The '*' to dereferences back to the real head
*headRef = newNode; // ditto
}
void PushTest() {
struct node* head = BuildTwoThree();// suppose this returns the list {2, 3}
Push(&head, 1); // note the &
Push(&head, 13);
// head is now the list {13, 1, 2, 3}


второй код:
void foo(char *ptr) {
    ptr++; // Move the pointer (but it's pass by value)
}
void bar() {
    char *str = "cat";
    char *ptr = str;
    foo(ptr);
    printf("%s\n", ptr); // Prints "cat"
}


Что я уже пробовал:

i was confuse here in first code<pre>Push(&head, 1)
он вызывает Push и дает адрес head, head-это указатель на узел структуры, который внутри него также указывает на другой узел.
&ампер;голова здесь обозначает адрес руководителя/адрес какой магазин зайти?
что на самом деле он передает функции Push

во втором коде есть foo(ptr), вызовы foo и pass ptr, ptr-это указатель на строку, и он указывает "c" в "cat", но на самом деле что передается функции foo?
это адрес ptr/адрес "c "в"cat"??
я был перепутан со значением указателя, адресом указателя и самим адресом переменной указателя!!!!!

4 Ответов

Рейтинг:
2

OriginalGriff

ОК, head объявляется как node* а это значит, что head это переменная, содержащая указатель на node объект.

Подумайте на минуту о машинах. У вас есть место на парковке, где вы припарковали свой автомобиль. Если вы позволите мне сесть за руль, вы не скажете мне: "это красный Форд Фиеста, регистрационный номер ABC 123", потому что мне придется обыскать всю парковку в поисках его - вы скажете мне, что он припаркован на уровне 3, ряд B, залив 17: 3B17 достаточно для меня, чтобы найти машину.
"3B17" - это адрес отсека, в котором находится автомобиль, или указатель на автомобиль. Если я перемещаю машину, я возвращаю другой адрес: "4А12", и вы можете найти машину и отправиться домой.

Аналогично, head не содержит первый узел в вашем списке - он содержит номер, который говорит вам, где находится этот узел: адрес узла. И точно так же, как и я, я нашел вашу машину, отправившись по этому адресу.
Чтобы перейти к узлу, вы следуете указателю-это называется разыменование указатель-путем префикса ' * ' или с помощью оператора ->.

Чтобы получить адрес чего-либо, вы ставите перед ним префикс "&": so &head дает вам адрес head, или указатель на указатель на узел.
А в C все значения передаются функциям по значению (а не по ссылке), что означает, что внутри функции вы используете копию того, что передается - любые изменения, которые вы делаете, не влияют на внешний мир. Это очень удобно:

void DoIt(int i)
   {
   i = 2 * i;
   }
Это нормально, когда вы делаете это:
int i = 666;
DoIt(i);
printf(i);
И вы получаете напечатанное значение 666. Если бы он проходил по ссылке, вы бы напечатали 1332 - что тоже работало бы, пока вы этого не сделали:
DoIt(666);
Передача значения означает, что функция не может влиять на внешний мир, поэтому нет никаких попыток изменить фундаментальные константы!

Поэтому, когда вы пишете:
Push(&head, 1);
Вы проходите через адрес head или указатель на head (или указатель на указатель на узел), что означает, что сама head может быть изменена функцией.

Когда вы используете свой foo функция, копия адреса 'c' в "cat" передается функции (по значению, помните), функция изменяет копию, автоматически увеличивая ее, и копия отбрасывается в конце функции, оставляя внешний мир неизменным.


Рейтинг:
0

Richard MacCutchan

В Примере 1 у вас есть оператор:

struct node* head = ...

который объявляет head как указатель на структуру узла. То есть сказать, что head является переменной-указателем, и ее значением будет адрес node структура; либо значение, возвращаемое malloc или BuildTwoThree. В призыве к Push у вас есть параметр 1 Как &head который передает адрес этой переменной (& является оператором addressof в C/C++). Передача адреса позволяет вызываемой функции изменять содержимое переменной.

В Примере 2 Вы передаете функции указатель, а не его адрес (на самом деле вы передаете временную копию). Таким образом, любые изменения указателя в функции не влияют на исходную переменную.


Рейтинг:
0

Patrice T

Цитата:
Разница между значением указателя, адресом указателя, переменной указателя

это самая трудная часть с, я думаю, что лучше всего читать справочник и делать упражнения.

Вот ссылки на справочники книг по С и с++ авторов этих языков. Обратите внимание, что C является предком C++, поэтому знание C всегда полезно с C++.
Язык программирования Си - Википедия, свободная энциклопедия[^]
https://hassanolity-да.files.wordpress.com/2013/11/the_c_programming_language_2.pdf[^]
http://www.ime.usp.br/~ПФ/Керниган-Ритчи/с-Программирование-электронные книги.формат PDF[^]

Язык Программирования C++ [^]


Рейтинг:
0

Member 13188016

ладно все равно я был в некотором замешательстве,,,

first code:
	

    void Push(struct node** headRef, int data) {
    struct node* newNode = malloc(sizeof(struct node));
    newNode->data = data;
     newNode->next = *headRef; // The '*' to dereferences back to the real head
     *headRef = newNode; // ditto
      }
      void PushTest() {
    struct node* head = BuildTwoThree();// suppose this returns the list {2, 3}
     Push(&head, 1); // note the &
     Push(&head, 13);
    // head is now the list {13, 1, 2, 3}

	


second code:

     void foo(char *ptr) {
    ptr++; // Move the pointer (but it's pass by value)
     }
    void bar() {
    char *str = "cat";
    char *ptr = str;
    foo(ptr);
    printf("%s\n", ptr); // Prints "cat"



i was confuse here in first code inside function PushTest, when it calls Push(&head, 1)

it calls Push and give head address, head is a pointer to a struct node that inside it, it also point to another node.
&head here means the address of head/address of what is store inside head?
what actually it pass to Push function??
and what actually Push receive??

in second code, there is foo(ptr), calls foo and pass ptr, ptr is a pointer to a string and it point "c" in "cat", but actually what is being passed to function foo?
is it the address of ptr/address of "c" in "cat"??
i was confused with pointer value, pointer address, and pointer variable address itself!!!!!