관심쟁이 영호

[C언어기초 #5.2] 포인터를 직접 사용해보자. 본문

학교공부/C언어의 왕!

[C언어기초 #5.2] 포인터를 직접 사용해보자.

관심쟁이 영호 2020. 2. 29. 20:59
반응형

안녕하세요.

최고왕입니다.

다들 잘 지내고 계신가요~?

 

글을 쓰는 현재로써는

전염병 때문에 난리도 아닙니다 ㅠㅜ

다들 손 자주 씻으시고

조심해요!!

 


오늘은 이전 시간에 배웠던

포인터를 실제로 사용해보는 시간을 가질 거예요!

 

혹시나 이전 포스팅을 못 보신 분들은 보고 오시기를 추천드릴게요!

 

이 전에 공부했던 포인터를 다시 한번 이론만 보시죠.

 

Pointer?

데이터 구조의 항목 A가 다른 항목 B의 어드레스를 보유하고 있을 때 A를 B의 포인터라고 한다.

(네이버 지식백과)

 

그럼 바로 코딩을 해볼게요.

 

 

포인터 선언

설명

int형의 변수 a를 선언하고 10을 초기화해주었습니다.

ptr이라는 포인터 변수를 선언하고 a변수의 주 솟값을 초기화해주었습니다.

 

이것을 그림으로 보기 좋게 도식화해드릴게요!

 

 

메모리는 이렇게 표현되어있다고 생각하시면 됩니다!

 

ptr이라는 변수 속에는 a변수의 주 솟값이 들어있어요.

 

그럼 여기서

*ptr은 무슨 뜻일까요??

 

*(asterisk) 설명

*(asterisk)가 변수 이름 앞에 붙게 된다면

 

그 뜻은

"포인터 변수가 저장하고 있는 주소로 접근하라."라고 생각하시면 될 것 같아요!

 

그럼 위쪽에 있던 코드상에서

*ptr은 어떤 값을 출력하게 될까요??

 

한번 생각해보세요!!

 

정답은 a의 값인 10을 출력하게 될 겁니다!

 

그럼 조금만 더 활용해보죠!

 

포인터로 변수값 바꾸기

자!

이 사진을 보시면

두 개의 출력문이 있어요.

 

각각 출력문에 해당하는 출력 값은 어떤 것들이 나올까요? 생각해보세요!

 

그럼 직접 출력해볼게요.

(보기 편하게 하기 위하여 약간의 코드를 추가했어요.)

 

출력문을 보니까 10과 15가 나왔어요!

 

그럼 위쪽 코드를 다시 한번 하나하나 살펴보도록 하죠 ㅎㅎ

 

 


int a = 10;              <- a변수 선언 후 10 초기화

int* ptr = &a;          <- 포인터 변수 ptr을 선언하고 a의 주 솟값 초기화

printf("  % d", *ptr);    <- *ptr을 출력

*ptr = 15;               <- *ptr에 15를 대입

printf("  %d", *ptr);    <- *ptr에 15 대입 후 다시 출력

 

자 이해가 가시나요!?

 

출력문을 다시 보시면

 

처음에는 10이었던 값이

15로 바뀌었어요!

 

그럼 여기서 의문!

포인터로 값을 바꾸면 실제로 a변수의 값도 바뀔 것인가?

바로 한번 확인해볼게요.

포인터를 이용한 변수 초기화

 

두 번째 출력문에서 *ptr에서 a로 바꿔주었습니다.

 

그럼 출력해볼게요.

(코드를 보기 쉽게 하기 위하여 약간 수정한 부분 있어요! 따라 하시다가 다르게 나오더라도 당황하지 마시길!)

오호~~

포인터를 이용해서 a에 새롭게 대입을 해주었는데

a변수의 값이 바뀌었어요!!

 

뭔가 이제 감이 잡히시나요~?

포인터를 이용하면 변수의 값도 바꿀 수가 있습니다 ㅎㅎ

 

오!

그럼 여기서 저번에 배웠던 전역 함수와 지역 함수 쪽으로 응용도 가능하겠지요!?

(지역 함수는 해당 지역에서만 취급된다.)

 

그럼 포인터를 이용해서 지역 함수를 사용해볼게요!

먼저 함수를 만들어주겠습니다.

(단순하게 값을 바꿔주는 함수를 만들게요.)

 

포인터와 함수

자 포인터를 사용하지 않고 a값을 바꾸려는 시도를 보여주는 코드예요.

바로 출력하여 보여드리겠습니다.

 

포인터와 함수 출력문

어라 분명

change 함수 내에서 a값을 새롭게 초기화해주었는데

change 함수를 거치고 난 다음의 a값을 출력해도 값이 바뀌지가 않았어요!

 

여기서 바로 포인터 함수를 사용해주어야 하는 겁니다!!

 

포인터를 이용하여 함수로 변수 새롭게 초기화

먼저 코딩한 내용을 보겠습니다!

 

포인터를 이용한 변수 초기화

이전과 달라진 점은.

 

일단 매개변수(맨 밑에 줄에 change옆에 괄호 내의 문자)가 달라졌어요!

 

ptr이라는 변수를 넘겨주었습니다.

 

그리고 change함수에서 ptr을 받고

그 변수 내의 주 솟값에 접근하여 그 값을 0으로 새롭게 초기화해주었어요.

(실제로 a의 값이 새롭게 초기화된 거나 다름없는 내용이에요.)

 

그럼 출력문을 새롭게 더 써봅시다!

 

포인터와 함수를 이용하여 변수 초기화

자 그럼 바로 출력문을 보시죠!

 

이렇게 나왔어요!

아까 변수를 매개변수로 넘겨서 바꿔준 것이랑은 다른 결과가 나왔어요!

 

포인터를 통하여 주 솟값을 넘겨주고

그 주 솟값에 접근하여 값을 바꿔주니

거기에 해당하지 않는 지역변수라도 값이 변하는 것을 볼 수가 있습니다.

 

이것이 C언어의 강점 중에 하나예요!

 


오늘은 여기까지 공부를 해볼 예정이에요!

 

다음 포스팅은 포인터와 배열을 함께 응용하여서 사용하는 시간을 가져볼 예정이에요.

 

그리고 이번 시간에 사용한 코드를 올려놓을게요!

 

  1. #include <stdio.h>

  2. void change(int* ptr) {

  3.         *ptr = 0;

  4.         printf("\n  change함수 내의 *ptr = % d\n\n", *ptr);

  5. }

  6. int main(void) {

  7.         int a = 123;

  8.        

  9.         int* ptr = &a;

  10.        

  11.         printf("\n\n  변수 a를 출력: % d\n", a);

  12.        

  13.         printf("\n\n  *ptr을 출력 : % d\n\n", *ptr);

  14.        

  15.         change(ptr);

  16.        

  17.         printf("\n  change함수 구동 후 변수 a를 출력: % d\n", a);

  18.         printf("\n\n  change함수 구동 후 *ptr을 출력 : % d\n\n", *ptr);

  19.        

  20. }


이해가 잘되셨을까 걱정이에요 ㅠㅠ

 

혹시나 이해가 안 되셨다면

 

언제든 댓글로 말씀해주세요!!

 

감사합니다 ㅎㅎ

 

오늘도 최고왕이었습니다.

 

좋은 하루 보내세요!

300x250
Comments