почему указатель получает предыдущее значение, возвращаемое из функции - PullRequest
3 голосов
/ 04 мая 2011

ребята, как ptr получает свое предыдущее значение? Код прост, мне просто интересно, почему он не хранит значение адреса, которое было присвоено в функции.

#include<stdio.h>
#include<stdlib.h>
void test(int*);
int main( )
{
    int temp;
    int*ptr;   
    temp=3;
    ptr = &temp;
    test(ptr);


    printf("\nvalue of the pointed memory after exiting from the function:%d\n",*ptr);
    printf("\nvalue of the pointer after exiting from the function:%d\n",ptr);


system("pause ");
return 0;
} 


void test(int *tes){

    int temp2;        
    temp2=710;
    tes =&temp2;

    printf("\nvalue of the pointed memory inside the function%d\n",*tes);
    printf("\nvalue of the pointer inside the function%d\n",tes);


}

вывод:

значение остроконечной памяти внутри функции: 710

значение указателя внутри функции: 3405940

значение указанной памяти после выхода из функции: 3

значение указателя после выхода из функции: 3406180

Ответы [ 3 ]

6 голосов
/ 04 мая 2011

Вы передали указатель по значению.

Указатель внутри test является копией указателя внутри main. Любые изменения, внесенные в копию, не влияют на оригинал.

Это может сбить с толку, потому что, используя int*, вы передаете дескриптор («ссылка», хотя на самом деле ссылка - это отдельная вещь, существующая в C ++) к int и, таким образом, избегаете копий что int. Однако сам указатель является самостоятельным объектом, и вы передаете , что , вокруг значения.

(Вы также пытаетесь навести указатель на int, который является локальным для функции test. Использование его будет недопустимым.)

1 голос
/ 04 мая 2011

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

test(&ptr);

void test(int **tes){
    int *temp2 = new int;
    *tes =&temp2;
}

Альтернативно, не связывайтесь с необработанными указателями. shared_ptr<> и & может быть вашим другом!

1 голос
/ 04 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...