2015-03-02 2 views
0

Я обнаружил, что если вы присвоите адрес указателя другому адресу указателя в FUNCTION, он не изменит значение в главном, , однако, делая то же самое в основном, он будет изменение. Так в чем причина этого?C указатель, ссылающийся на другой указатель в функциях

void func(int *a, int *b){ 
    b = a; 
} 


int main(){ 
    int i= 5, k =6, *a=&i, *b=&k; 
    printf("%d %d\n",*a,*b); //output 5 6 
    b = a; 
    printf("%d %d\n",*a,*b); //output 5 5 

    a=&i; 
    b=&k; 
    func(a,b); 
    printf("%d %d\n",*a,*b); //output 5 6 
    printf("%d %d\n",*a,*b); //output 5 6 
} 
+1

Поскольку вы передали указатели копией, а затем сменили копии указателей. –

+0

Кстати, вы никогда не называете функцию. Это ошибка копирования? – Barmar

ответ

1

В этой функции

void func(int *a, int *b){ 
    b = a; 
} 

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

void swap(int **a, int **b){ 
    int *tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 
0

Ваша функция:

void func(int *a, int *b){ 
    b = a; 
} 

ничего не делает, он просто принимает два значения, представляющие адреса памяти в качестве параметров и назначает один к другому без какого-либо внешнего воздействия вообще. Он просто записывает значение одного в другое (возможно, даже не того, потому что компилятор, скорее всего, обнаружит, что это бессмысленно и полностью его устранит), он ничего не делает с информацией, хранящейся на этих адресах. Вам нужно будет оттолкнуть указатель на чтение или запись на адрес памяти, в котором он хранит значение, но в данной форме функция не назначит указатель другому, а значение i - k.

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

Так оно и должно быть:

void func(int **a, int **b){ 
    *b = *a; 
} 

и func(&a,&b), и вы будете воспроизводить то, что вы делаете в main через b = a.

+0

Здесь нет целых чисел без знака –

+0

@MattMcNabb - указатели представляют собой целые числа без знака. – dtech

+1

нет, они указатели –

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