본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
C

[C] 포인터 변수 자유자재로 사용하기!

by Hazard3_o00sung 2020. 12. 7.
728x90

진짜 강력한 프로그래밍 언어, C언어입니다

Really Powerful Programming Language C

진짜 진짜 강력한 프로그래밍 언어 C언어의 포인터 변수에 대해서 설명하도록 하겠습니다!! 진짜 뭐 너무 강력해서 입이 다물어지지 않는 아주 완벽한 언어죠. 저도 C랑  C++을 제일 좋아하고 가장 많이 사용하는데요, 그만큼 어디서든 사용할 수 있고, 어떤 시스템이든 범용적으로 사용할 수 있다는 점은 C언어를 더욱 매력적으로  보게 만드는 점이라고 생각합니다. C언어는 1972년 탄생해서 아직 까지 실무, 특히 코어 작업에서는 빠질 수가 없는 언어이기 때문에, 전공자분들이라면, 마스터까진 아니더라도 어느 정도 자유자재로 사용하실 수 있으셔야 합니다!!

 

Pointer Variable in C

Pointer variables in C _ 출처 : geeksforgeeks.org

이미 포인터 변수를 검색해보셨다는 것은 사용하려고 검색해보셨다거나, 배우는 입장에서 책의 내용이 이해가 잘 가지 않아서, 혹은 책에서 배운대로 했는데 잘 안돼서 여러 가지 이유가 존재할 거라고 생각합니다. 제 생각으로는, 추상적으로 포인터 변수를 이해하려는 자세가 중요하다고 생각합니다. 위 그림을 보게 되시면, 음 잘 이해가 안 가죠? 코드로 작성해서 보여드리도록 하겠습니다.

 

Pointer Variable in Integer

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int a = 10;
    int * b = &a;
 
    printf("%d\n"*b);
    return 0;
}
cs

 

위 코드를 보도록 하죠! 음 우선 뭐 너무 간단하죠? 사실 정수형 포인터 변수는 뭐 그냥 이해하기 엄청 쉽죠, 우리는 지금 a에 변수 10을 삽입했습니다! 그러고 아래에서 *을 붙인 변수 b, 즉 포인터 변수를 하나 선언했습니다. 그리고 a의 주소값을 참조하도록 선언했습니다. 결괏값은 당연히 10이 출력됩니다! 너무 간단하죠? 이까진 책에서 그냥 이해를 할 수 있는 수준입니다. 하지만, 내가 *(에스테리스크)를 앞에 다가 붙였는데, 왜 안되지 이런 상황이 많은데 보통 이런 상황은, 배열이나 문자열에서의 포인터 변수 실수로 컴파일이 안되거나, segmantaion fault(메모리 오류)가 많이 발생합니다. 그렇다면, 문자열부터 보도록 하겠습니다.

Pointer Variable in Char

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
 
char printChar(char **foo){
    char *bar;
    bar = foo;
    printf("%s\n", bar);
    return *bar;
}
 
int main(){
    char a = 'a';
    char *b;
    b = &a;
 
    char arr[] = "Hello World R";
    char *arr2;
    char *arr3;
    arr2 = &arr;
    arr3 = arr2;
    printChar(arr3);
 
    char **arr4;
    arr4 = arr3;
    printf("double : %s\n", arr4);
    return 0;
}
cs

  위 코드를 보도록 하겠습니다. 어후 너무 뭐 복잡하죠ㅠㅠ 코드의 가독성은 저리 치워버리고 코드만 보도록 할게요; main함수에서 첫 줄에 선언된 문자 a가 보입니다. 그 아래 포인터변수는 a의 메모리 주소를 참조합니다. 그렇기 때문에 b를 출력하게 되면, 그냥 a가 출력된다는 점은 아시겠죠? 그까진 쉬워요 

아래에 코드를 보면 arr이라는 문자열 변수가 선언되고 포인터 변수가 두개가 더 선언되었습니다. 그리고 arr2는 arr의 메모리 주소 값을 참조합니다. 그리고 arr3에 포인터 변수 arr2를 대입합니다. 그리고 제가 하나 정의한 문자열 출력 함수에 넣어줍니다. 이때 함수의 인자에 포인터가 두 개 붙어있음을 알 수 있습니다. 이는 더블 포인터 변수입니다. 이런 애들이 어려워서 검색하신 거 맞죠?

 

Pointer to Pointer _ Designed by own

 

위 그림을 한번 볼게요, 맨 오른쪽 변수인 var은 10이라는 값을 가지고 있고 자기만의 주소가 있습니다. 그리고 ptr1은 현재 포인터 변수의 주소가 원래라면 할당되지만, var를 가르키기 때문에 var의 주소 값을 참조해 가집니다. ptr2의 변수는 ptr1의 주소를 참조하기  때문에, 바꿔 말하면, ptr2는 결국 var를 가리키는 것과 같습니다. 어떤가요 괜찮으신가요!?  투 포인터 개념을 이해했다면, 배열은 좀 더 쉽게 이해하실 수 있겠군요! 사실 C++ 언어나 C언어를 잘 다루려면, 포인터 변수는 사실 필수적이니까요...ㅠㅠ 어렵더라도 꼭!

 

배열을 보도록 하겠습니다!

Pointer Variable in Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
void Foo(int **arr){
 
}
 
int main(){
    int arr[10= {1,2,3,4,5};
    int *arr1;
    int *arr2;
    arr1 = &arr[0];
    arr2 = arr1;
 
    for (int i = 0; i < 5; i++){
        printf("Num : %d\n", arr2[i]);
    }
    return 0;
}
cs

출력까지 당연히 해보셔야하는거 아시죠? 위와 같은 개념으로 배열 또한 포인터 변수로 이해를 너무나도 쉽게 했습니다!! 그렇다면 이걸로 뭘 해볼 수 있을까요? 제가 위에 Foo()라는 함수를 만들었는데, 여기다가... 배열 내의 요소 중 하나를 변경해서 출력하는 함수를 여러분들이 직접 작성해보는 건 어떨까요?! 이때까지 개념을 잘 이해하셨다면, 무리 없이 하실 수 있고요, 정 모르겠다 하시면 댓글 남겨주세요!!

 

 

포인터 변수에 대한 설명을 간략하게 했는데, 이렇게 설명드려도 계속 써보지 않으면 이해하기 어렵습니다..ㅠㅠ 잘까먹고 그렇기 때문에 위 코드들은 모두 독학하세요!! 반드시!!

 

댓글로 문의 , 피드백 환영합니다!!

 

 

감사합니다!

 

728x90

댓글