2014-11-17 2 views
0
#include<stdio.h> 

int q = 10; 

void fun(int *p){ 
    *p = 15; 
    p = &q; 
    printf("%d ",*p); 
}  

int main(){ 
    int r = 20; 
    int *p = &r; 
    fun(p); 
    printf("%d", *p); 
    return 0; 
} 

Я играл с указателями. Не удалось понять результат этого. Выход поступает как 10 15. Как только p указывает на адрес q, почему при возврате к основной функции изменяется значение? Также почему он изменился на значение «15», которое было присвоено ему в функции до «10».Указатели внутри функции в C

ответ

5

Потому что p is fun() не то же самое p в main(). p, в каждой функции, является локальной. Поэтому изменение одного не влияет на других.

+0

Но оно показывает выход как 15 внутри main! Это должно быть 20, затем – rocker

+1

Поскольку вы перебираете значение в 'p' в fun() с помощью:' * p = 15; 'Обратите внимание, что есть разница в изменении значения * указателя * и того, что это * точка до *. –

+0

Хорошо. дурак я ! – rocker

1

два этапа:

  1. Первый вызов fun(), назначение адреса глобального int q [холдинг значение 10] для pвнутри fucntion рамки и печать. Первый выход ==>10;

  2. После возвращения вызова из fun(), он будет держать предыдущий адрес, [передается от main()] и, следовательно, будет выводить значение проводится по этому адресу [которое 15, модифицированное внутри fun()].

3

В C, все параметры функции передаются по значению, в том числе указателей.

*p = 15;будет установить r до 15, как *p указывает на память, занимаемого r в main() до его переназначения в &q;

Вашего переназначение p = &q; делает не изменить то, что p точки в вызывающих main(). Для этого вам нужно будет косвенно косвенно коснуться указателя, т. Е. Изменить прототип функции на void fun(int **p){, вызвать его с помощью fun(&p); и переназначить с помощью *p = &q;.

+0

Тогда как получилось, что он выводит 15 в качестве выхода внутри основной функции? – rocker

Смежные вопросы