2016-11-08 1 views
-1

아래 코드의 출력을 이해하는 데 도움이 필요합니다. (이것은 숙제가 아닌 중간 고사를위한 샘플 질문 일뿐입니다.) 내가 코드를 통해 갔다포인터를 사용하여 출력 결정

#include <stdio.h> 
void figure_me_out(int* a, int b, int c, int* d); 

int main(void) { 
    int var1 = 1, var2 = 10, var3 = 15, var4 = 20; 
    figure_me_out(&var1, var2, var3, &var4); 
    printf("%d, %d, %d, %d\n", var1, var2, var3, var4); 
    return 0; 
} 

void figure_me_out(int* a, int b, int c, int* d) { 
    c = b; 
    b = *d; 
    *a = 222; 
    *d = 100; 
    a = d; 
    *a = c; 
} 

출력

222, 10, 15, 10 

, 나는이 내 논리였다 100, 10, 10, 15를 가지고 :

C = 10 ---> C였다 값으로 전달되었으므로 printf에 대해 c가 변경되지 않습니다.
b = 20 ---> 위의 이유와 동일
* a = 222 ---> 이것은 a를 역 참조하고 222의 값을 제공합니다. var a가 전달되었으므로 참조로 원래 값을 변경합니다.


위와 (I는 혼란스러워 일부인)
* D = 100 ---> 동일한 이유 A = 100 ---> I는 생각하고 그 D가 100로 변경 한 이후, 즉 a가 현재 d와 같은 값이 100으로 지정됩니다.
* a = 10 ---> a의 값을 10으로 변경

이 함수는 b (var2)의 원래 값을 변경하지 않았으며 c (var3) 값으로 전달되었으므로 나머지는 변경되었습니다. a = d; : 왜 222 인쇄 및 var4 인쇄를 VAR1에 그래서 나는 10

+0

C는 참조 전달을 지원하지 않습니다. 그것은 엄격하게 가치에 의한 것입니다. 포인터는 참조가 없으며, 예를 들어. 'int'. – Olaf

답변

1

는 내가 생각하는 간단한, 단계적으로 갈 수 있습니다 얻을 수 있음을 의미 :

void figure_me_out(int* a, int b, int c, int* d) 
{ 
c = b; // c = 10 
b = *d; // b = 20 
*a = 222; // *a = 222 : Value at address a is changed to 222 
*d = 100; // *d = 100 : Value at address d is changed to 100 
a = d; // a = d: Change address of local pointer variable a to d. 
*a = c; // Changing value of address a which is same as address d to 10 
} 

3 단계에서 당신이 주소에 원래 값을 변경 한

당신이 주요 기능에서 통과 이는. 5 단계에서 전달 된 주소를 메인에서 로컬 변수 으로 바꾼다. a = d를 수행 한 후 주소가있는 지역 변수가 d의 주소로 변경됩니다. 이제이 주소와 함께 할 아무것도,가 6 단계에서 당신은 10

그래서 최종 답변 오는이, 15 10 222 인에 D의 값을 변경 한 D의 주소 위치에 영향을 받게됩니다 10

+0

설명이 정말 도움이되었습니다! a = d는 혼란 스럽지만 이제는 이해합니다. 도움을 주셔서 감사합니다. – Jasmine

+0

'a = d'는 주소가 아닌 로컬 포인터 변수의 값을 변경합니다. 변수의 주소를 변경할 수 없습니다. 포인터의 값은 다른 객체의 주소입니다. *는 변경된 주소입니다. (다시 개체의 주소를 변경하지 않으면 포인터가 가리키는 위치가 변경됩니다) –

0
  1. bc 당신이 main에서
  2. a*a = 222
  3. 까다로운 부분 변경 말한대로 변경되지 않습니다 혼란 스러워요 ad 변수의 위치를 ​​가리키고 있음을 의미합니다. main()입니다. 다음 *a = ca (및 d)이 가리키는 개체에 10을 넣습니다. dmain()10
0

도움이되기를 바랍니다. 아래의 C 코드 스 니펫을 참조하십시오.

#include <stdio.h> 

void figure_me_out(int* a, int b, int c, int* d); 

int main(void) 
{ 
    int var1 = 1, var2 = 10, var3 = 15, var4 = 20; 
    figure_me_out(&var1, var2, var3, &var4); 
    printf("%d, %d, %d, %d\n", var1, var2, var3, var4); 
    return 0; 
} 

void figure_me_out(int* a, int b, int c, int* d) 
{ 
    c = b;  // Explanation: c is overidden by b, that means 10 so c is 10 now 
    b = *d;  // Explanation: b is 20 
    *a = 222; // Explanation: var1 value modified and it is set 222 (Called by ref.) 
    *d = 100; // Explanation: var4 value modified and it is set 100 (Called by ref.) 
    a = d;  // Explanation: integer pointer a stored address of the var4 
    *a = c;  // Explanation: 10 assigned to var4 (Because c already modified in first line of the this function) 

    //Finally you will get: 222 10 15 10 
} 
관련 문제