int a = 20;
int *b =;
b = &a;
*b = *b + 10;
printf("%d %p %d\n" , a,b,*b);
출력 값 : 30, &a, 30
int a의 값은 20이다.
포인터변수 b를 선언한다.
변수 b는 포인터 변수이기 때문에 주소값을 저장할 수 있게 된다.
b에 a변수의 주소값 &a를 저장한다.
포인터 변수 b에 10을 더하여 다시 저장한다.
포인터 변수 b는 a변수의 주소값 &a가 저장되어 있으므로 a주소에 저장된 값 20이였으며 10을 더하여 30이 된다.
출력문을 출력하게 되면 a의 값이 30이 되는데 이 말은 포인터 변수가 가르키는 주소에 저장된 값은 공유가 된다는 뜻이다.
이것을 역참조 라고 한다.
역참조 : 주소를 통해 값에 접근한다.
역참조는 포인터 변수 앞에 '*'을 붙여 사용한다.
포인터 변수를 선언할 때도 *을 붙이지만 선언할 때 붙인 *과 선언한 후에 붙이는 *은 다른 연산을 수행한다.
선언 한 후에 붙이는 *의 연산은 해당 포인터변수에 저장된 주소에 접근하게된다.
접근이 가능하면, 값을 읽어올 수 있음은 물론 해당 주소에 저장된 값을 바꿀수도 있게된다.
int a = 1;
int *pa;
pa = &a;
printf("a에 저장된 값 : %d\n",a);
printf("a의 주소값 : %p\n",&a);
printf("pa에 저장된 주소값 : %d\n",pa);
printf("pa에 저장된 주소값을 역참조 한 값 : %d\n",*pa);
a에 저장된 값 : 1
a의 주소값 : a의 주소값
pa에 저장된 주소값을 역참조 한 값 : a의 주소값
pa에 저장된 주소값을 역참조 한 값 : 1
만약 이때 *pa 즉, pa저장된 주소에 접근(역참조) 하여 값을 변경한다면 a의 값이 어떻게 변할까?
*pa = 2;
printf("a에 저장된 값 : %d\n", a);
printf("pa에 저장된 주소값을 역참조 한 값 : %d\n", *pa);
a에 저장된 값 : 2
pa에 저장된 주소값을 역참조 한 값 : 2
a = 2; 라고 선언하지 않고도 a의 값을 2로 바꿀수 있게 된것이다.
역참조 연산자(*)로 pa가 a에 접근한 다음 그 값을 2로 바꾼것이다.
마찬가지로 a=2; 로 선언하여 값을 a의 값을 2로 변경하고 *pa를 출력하면 2가 출력이 된다.
참조 : m.blog.naver.com/nsj6646/221486028315
다시한번 상황을 정리하면
a의 주소에는 20이 저장되어 있었다.
a는 아무것도 하지 않았는데 자신의 주소에 저장된 값이 30으로 변경되었다.
a의 주소값을 가리키는 포인터 변수 b의 값이 변경되니 a의 주소값에 저장된 값도 변경이 된것이다.
이것을 역참조 라고 부르며 포인터 변수 b 에 저장된 주소를 역참조 한 값이라고 정의한다.
구독과 공감 혹은 댓글이 블로거에게는 큰 힘이 됩니다.
'정보처리 산업기사 실기' 카테고리의 다른 글
C언어 & JAVA 파일 입출력 코드 형식 (0) | 2021.03.22 |
---|---|
C언어 scanf() 함수 형식 및 '문자열' 인자 형식 ("%s", ____) (0) | 2021.03.22 |
C언어 난수 관련 함수 rand() / srand() / time() (0) | 2021.03.11 |
100개의 수 중 77에 가장 가까운 수를 구하는 알고리즘 순서도 (0) | 2021.03.09 |
1부터 100의 범위 안에서 가장 큰 소수를 구하는 알고리즘 풀이 (0) | 2021.03.09 |