전공자 아니고 나이 30대에 취미삼아서 배우는 중입니다.
\
여기서 첫번째 change 함수 호출때 x의 값이 x1에 대입하고 x의값은 변하지 않아서 계속 5이고
두번째 change 함수 호출때는 주소값 &x가 포인터 변수 *x2와 같아진다는 개념이므로, *x2가 100이면 &x 도 동시에 100이 된다. 이렇게 설명하는데
이해가 잘안됩니다. 물론 포인터나 배열에서 말하는 메모리 주소값을 저장하는 주소값을 저장한다라는개념은 압니다.
결국 처음 change 함수 호출시에는 x값이 x1에 적용되서 5=50이 같아진다는거고
두번째는 포인터와 주소값을 대입할때는 서로 같아진다는 개념으로 생각해야 하는겁니까?
그래야 &x가 매개변수로 올때 기존에 *x2가 없어지지 않고 &x와 *x2가 같아져서 &x= *x2 개념이 성립되어 *x2 =100이면 &x도 100이 된다는 의미로 생각해야 한다는건가요? 즉 저런경우 일반 상수로 대입될때는 그 해당 변수를 완전히 대체하고 해당변수x는 대체되서 사라지고,
포인터와 번지 연산자&는 주소값을 가리키므로 사라지는 개념이 아니라 같아진다는 개념으로 생각해야 하는겁니까?
int* int** 증명 검색해봐라
c에서 =는 equal이 아니라 assign임. a=1은 a가 1이라는게 아니라 a에 1을 write한다는거. 이걸 헷갈리면 애로사항이 꽃피니 생각해봐.
포인터로 지정하지 않고 아래 매개변수로 값을 변경하면 서로 주소가 달라 main에서의 값은 변하지 않습니다. 이에 대한 이해는 change_x1 부분과 메인에 printf("%p",&x1;)printf("%p",&x;) 를 써서 주소를 비교해보세요 다를겁니다. 변수명을 똑같게 해도 주소는 다릅니다. 요점은 주소죠
그리고 '=' 부분 이해 못한 것 같은데 윗분이 쓰심
감사합니다. 값을 write한다는 개념에서 생각해봐야 하네요 주소값이 지정되야 변하는거,,,
연산자에 *들어가면 무조건 그 값에는 주소가 들어간다고 생각하면 편함. *x로 지정된 주소의 값을 100으로 바꾸니까 두번째 함수를 실행했으면 이며 x값에는 100이 들어간것으로 변수 x는 주소는 그대로이지만 값만 변한거임
void change_x2(int *x2)에서 매개변수에 붙은 *는 Pointer 타입이라는 표현이고, 함수 내에 있는 *x2 = 100 에서 *는 Dereference 연산자임. 전혀 다른 의미
다시 생각해보니 첫번째 매개변수 지정한거는 지역변수이니 x=50이 함수끝나면 사라져서 전역변수 x=5값이 적용되는거고
두번째는 주소값을 메모리에 존재하는것을 변경해서 유지된다는 걸로 지금 생각되는데,,, 맞나요?
아 그러니까 매개변수에 붙은 포인터x2와 함수 내에 있는 포인터 x2는 대입되는 개념이 아닌가요?
정답에 가까이 온 것 같은데. call by value랑 scope 공부하면 되겠네.
첫번째는 지역변수로 끝나서 x값이 변경되도 함수 가 끝나면 초기화 되서 전역변수 x=5값으로 보는거고,
두번째는 포인터로 x의 주소값 자체에 저장되므로 함수가 끝나도 주소값에 접근하는거니 저장되있는거고요 포인터 자체가 메모리에 접근하는 전역변수니
감사합니다. 이해했네요