위의 코드를 확인해보면 포인터 변수를 선언하고 int 변수에 2를 초기화했다.
포인터 변수는 pointer to int 라는 자료형을 가지고있다.
이 자료형은 메모리의 주소를 담을 수 있다.
그래서 각각의 값들을 출력해보면
다음과 같은 출력값이 나온다.
&num은 num의 주소를 표현하는 것이라 주소값이 출력된 것이고,
pointer 변수는 자료형이 pointer to int기 때문에 &num(num의주소)이 저장 되어 위와 같이 출력된 것이다.
[ 여기서 알수 있는 점 ]
int *pointer; -> 자료형은 pointer to int 이고, 주소값이 저장될 수 있는 자료형이다.
&num -> 주소값을 나타낸다.
근데 이번에는 출력형식포맷으로 %d 정수를 출력하도록하고, pointer(주소가 담겨있는 변수)애 한테
*를 붙혀보았다. 그랬더니 출력이..
2가 나왔다. 엥? 위에서는 주소값이 나왔는데 *을 붙히니까 주소안에 저장된 변수값이 나오네?
맞다. 주소를 가르킨다는건 변수가 담겨있는 박스의 위치만 알려주는 것이고,
*를 붙힌다는건 주소를 알고있다면 그 주소에 값을 알려달라는 의미다.
그래서 pointer 변수에 주소가 저장되어 있어서 *만 붙혀도 값을 가져올 수 있는 것이다.
[ 여기서 알수 있는 점 ]
주소가 저장된 변수에 *를 붙히면 주소에 저장된 값을 가져올 수 있다.
그런데 다음과 같이 해보았다.
위에서는 *를 붙혀서 출력을 했지만 이번엔 *를 붙혀서 값을 넣을려고 한다.
결과를 예상해보자.
다음과 같이 20이 나온다. 왜 이렇게 될까?
pointer 변수는 주소를 저장하고있다. 주소를 알고있다는 의미다.
그렇다면 주소를알고있는 변수에 *를 붙히면 그 값이 출력되니,
pointer 변수앞에 *를 붙히면 똑같이 주소가 가르키는 값에 20을 넣어라 라는 의미가 된다.
문제다. 잠깐 여기서 멈추고 생각해보자.
이렇게 코드를 작성해봤는데 어떨까? 맞나? 틀리나?
생각의 ----------------------------------------------------------- 경계
다음과 같이 나온다. 왜일까?
지금 *poninter는 주소의 값을 가르키고 있는 상태다. (20을 바라보고있는 상태)
그런데 &num은 주소의 위치를 표현하고있다. (0095FA1C)
*pointer -> 즉 20을 바라보고 있으니 자료형이 int인 상태이다.
&num -> 0095FA1C를 바라보고 있으니 int형과 자료형이 일치하지 않는다.
그래서 오류가 나는 것이다.
그럼 이것을 어떻게 바꿔야할까?
다시 이렇게 바꿔준다면 pointer는 주소값을 저장하는 변수이고 &num의 주소값을 표현하는 형태이기때문에
맞는 방식이된다.
그러면 다시 출력했을 때 올바르게 주소값이 다시 출력이 된다.
[ 요약 ]
1. int *pointer; -> 자료형은 pointer to int
2. 출력하거나 초기화 시킬 때 변수 앞에 *를 붙히면 값을 변경, 값을 출력 의미가 된다.
3. *pointer = 20 O, pointer = &num O, *pointer = &num X, pointer = num X
4. *pointer(값을 가르킴) , &num (주소를 표현하는애), num(값을 표현하는 애), pointer (주소를 담는애)
5. X로 표시된 애들은 주소에 값을 담으려하고 값에 주소를 담으려하기 때문에 안된다.
'기타' 카테고리의 다른 글
[파이썬] TypeError: 'list' object is not callable 에러 (0) | 2021.02.16 |
---|---|
갤럭시버즈 플러스 한쪽만 안들릴 때 해결책 (0) | 2021.01.25 |