[완료]초간단 C 퍼즐..그러나 이상한...

burnoutband의 이미지

안녕하세요. 맨날 눈팅만하다가 엄청간단한 코드의 결과값이 예상과 달라서 이렇게 글을 올려봅니다.

#include <stdio.h>
 
int read (int *ip)
{
    scanf("%d", ip);
    printf("ip = [%d %p], *ip = [%d]\n", ip, ip, *ip);
    return *ip;
}
 
int main (void)
{
    int val = 2, ch = 3;
    printf("val = [%d], ch = [%d]\n", val, ch);
    printf("val = [%p], ch = [%p]\n", &val, &ch);
 
    printf("read(&val) = [%d], read(&ch) = [%d]\n", read(&val), read(&ch));
    printf("last >>>>>> val = [%d], ch = [%d]\n", val, ch);
 
}

예상결과가 뒤바뀌어서 나옵니다. 중간에 read함수 실행할때 7과 8입력했습니다. val의 메모리주소는 0xbff40ccc. ch의 메모리주소는 0xbff40cc8였습니다.
허나, printf("read(&val) = [%d], read(&ch) = [%d]\n", read(&val), read(&ch)); 명령을 수행할때, var의 주소를 넘겨서 read를 호출했는데, 실제로 read()에서 출력된 주소는 ch의 주소였습니다. 상식적으로 이해가 안되서 이렇게 질문합니다.
제가 어떤부분을 놓치고 있나요??
in2out의 이미지

조금 착각을 하신거 같은신데요,

printf("read(&val) = [%d], read(&ch) = [%d]\n", read(&val), read(&ch));

요기서 처음으로 불려지는건

read (&val)이 아닌,

read (&ch)가 불려지게 됩니다.

burnoutband의 이미지

답변해주셔서 감사합니다.
찾아보니 저랑 비슷한 질문을 하신 분이 이미 계셨네요
http://kldp.org/node/96259
즐프..-_-;;