정보처리 산업기사 실기

C언어 포인터의 역참조(주소를 통한 값 공유)

유혁스쿨 2021. 3. 10. 16:47
728x90
반응형
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

 

[C언어] 포인터의 역참조(dereference)

저번 강의에서 포인터가 무엇인지에 대해서 배웠습니다.이번 강의에서는 포인터로 무엇을 할 수 있는지 알...

blog.naver.com

 


다시한번 상황을 정리하면

a의 주소에는 20이 저장되어 있었다.

a는 아무것도 하지 않았는데 자신의 주소에 저장된 값이 30으로 변경되었다.

a의 주소값을 가리키는 포인터 변수 b의 값이 변경되니 a의 주소값에 저장된 값도 변경이 된것이다.

이것을 역참조 라고 부르며 포인터 변수 b 에 저장된 주소를 역참조 한 값이라고 정의한다.

 

 

구독과 공감 혹은 댓글이 블로거에게는 큰 힘이 됩니다.

728x90
반응형