2015-01-25 2 views
0

Мне было любопытно узнать, почему адреса того же массива, т.е. массив b в моем случае изменяется до и после того, как он был передан функции манипуляции (), как показано на выходном изображении. enter image description here Пожалуйста, поделитесь своими мыслями и помогите мне разобраться в этом. Спасибо!Array показывает разные адреса до и после передачи функции по ссылке

#include <stdio.h> 
void manipulation(int *pa,int *pb){ 
    int i; 
    for(i=0;i<10;i++){ 
     *(pb+i)=*(pa+i); 
     printf("%d\t %04x\n",*pb+i,&pb+i); 
    } 
} 

int main(){ 
    int a[10],b[10]; 
    int i; 

    int *point; 
    point = &b[0]; 
    printf("Enter the array elements\n"); 
    for(i=0;i<10;i++){ 
     scanf("%d\n",&a[i]);  
    } 

    for(i=0;i<10;i++){ 
     printf("%04x\n",&point+i); 
    } 

    manipulation(&a[0],&b[0]); 
    return 0; 
} 
+0

Почему бы не написать это '* (pb + i) = * (pa + i);' this way 'pb [i] = pa [i];'? –

+1

что вы ожидаете от '& point + i'? –

+0

BTW 'scanf ("% d \ n ", &a[i]);' -> 'scanf ("% d ", &a[i]);' – BLUEPIXY

ответ

1

Да, реальные проблемы сравнивает адрес point по адресу pb.

Попробуйте использовать point + i (или &point[i]) и pb + i (или &pb[i]). Я уверен, что вы получите ожидаемый ответ.


В случае, если вы любопытны, &point + i это место в памяти локальной переменной point плюс значение i. &pb + i - это местоположение в памяти параметра pb плюс значение i. Это разные переменные, поэтому они имеют разные места в памяти.

+0

Большое вам спасибо за указатели Я не понимал, что смотрю адрес указатель, а не адрес, на который он указывает. Цените свою помощь. – Sudhir91

2

потому, что вы печатаете (адрес вашего указателя) + I:

printf("%04x\n",&point+i); 
printf("%d\t %04x\n",*pb+i,&pb+i); 

вы хотите напечатать указатель + I:

printf("%04x\n",point+i); 
printf("%d\t %04x\n",*pb+i,pb+i); 

Также у вас есть ошибка там:

printf("%d\t %04x\n",*pb+i,pb+i); 

*pb+i понимается как (*pb) + i, что является первым значением массива плюс i, или просто pb[0]+i.

вы, кажется, чтобы получить правильный ответ, потому что ваш массив 1 2 3 ...

вы, вероятно, хотите:

printf("%d\t %04x\n",*(pb+i),pb+i); 

или просто:

printf("%d\t %04x\n",pb[i],pb+i); 
0

точки Хранит адрес массива a. & точка печатает адрес точки и добавляет 4 через петлю. То же самое происходит с & pb. 28fee8 - это место, где хранится точка, а 28fed4 - это место, где хранится pb.