본문 바로가기
C++ 200제/코딩 IT 정보

C언어 포인터 기초 - 변수 주소와 포인터의 포인터

by vicddory 2019. 6. 30.

C언어 포인터 이해하기


최근 JAVA나 C# 같은 언어는 GC 기능이 메모리 관리할 필요가 없습니다.

하지만 OS 내장 프로그램을 만들고 싶을 때 피할 수 없는 것이 C언어입니다.


다른 프로그래밍 언어를 배우거나 배운 분들에게 낯설고 때로는 불쾌한 기분도 들게 만드는 게 C언어 포인터입니다. C언어를 배우려면 다른 언어에는 없는 포인터는 꼭 이해할 필요가 있습니다.


한 눈에 확인하는 포인터와 연산자 - C++ 포인터도 똑같은 개념


포인터 배우기 전에


포인터 배우기 전에 pointer를 이해하는데 필요한 것이 하나 있습니다.


바로 주소입니다.

더 쉽게 말하자면 메모리 장소(위치)입니다.


프로그램을 작성할 때 변수 등을 선언하면 해당 변수는 데이터 형식에 따라 필요한 만큼 메모리 위치(크기)를 확보합니다.

이점은 C언어뿐만 아니라 다른 언어도 마찬가지이므로 기억해 두시면 손해 볼 것은 없습니다.


C언어에서 주소 위치는 변수 앞에 "&" 기호를 붙여 표현합니다. 덧붙여 &를 주소 연산자라고 부릅니다.



1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int  main () 
    int a = 0;
    printf("변수 a의 주소는 % d"&a);
 
    return 0 ; 
}
cs


포인터가 뭐야?


주소가 나왔습니다. 왜 포인터 이야기하는데 주소가 나올까요?

대답은 간단합니다. 주소 위치에 변수를 할당하기 때문입니다.


그리고 주소를 저장하고 있는 변수를 "포인터 Pointer"라고 합니다.


위 코드에서 변수 a의 주소는 &a로 표현했습니다. 이젠 주소를 나타내는 &a에 포인터를 대입해 봅시다.



1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
    int a = 0
    int *pa ; // 포인터 선언 
 
    pa = &a; //이 포인터에 주소 할당
    *pa = 1// a의 주소에 1을 대입, 즉 a에 1을 대입하는 것
 
    return 0 ; 
}
cs



간단합니다.


위의 소스 코드처럼 변수 pa와 같이 포인터 선언을 합니다. 또한 "*"를 포인터 연산자라고 합니다.


포인터를 선언한 후 주소를 대입해 봅시다.

일반 콘솔 프로그램이라면 컴파일 오류 또는 경고가 발생합니다. 만약 exe 파일이 있다면 실행하지 마세요.


정의되지 않은 pointer 에 값을 할당한다는 것은 매우 위험한 것으로 시스템 자체에 오류를 유발할 수 있습니다.


NULL = 널


포인터의 포인터 pointer of pointer

재밌게도, 포인터의 포인터도 얻을 수 있습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int a = 0;
    int *pa;  // 포인터 선언 
    int **pp; // 포인터의 포인터 선언
 
    pp = &pa; // 이 포인터에 주소를 할당
    **pp = 1// 포인터의 주소 대입
    pa = &a;  // p의 주소에 1을 대입, 즉 a에 1을 대입
 
    return 0;
}
cs


마지막으로


포인터의 개념을 이해하셨나요?


아직 이해가 안 된다면, Java를 예로 들어볼게요.

자바 입장에서 말하자면 C언어 포인터는 참조와 비슷합니다.


예를 들어 자바에서,



1
2
3
4
int[] a = {1,2,3,4,5};
int[] b;
 
b=a;
cs



같은 코드를 작성한 것입니다.


b = a에서 배열 a의 주소를 배열 b에 전달하므로 필연적으로 a, b는 같은 값을 보유합니다.


그래서 어느 한쪽을 변경하면 다른 쪽도 변경됩니다.


포인터는 이와 같은 개념입니다.


포인터 개념 정리 및 이해하기


C언어 공부 글 더보기

마이크로프로세서 주소 지정 방식

https://codingcoding.tistory.com/596


Call by Reference, Vale, Address 차이

https://codingcoding.tistory.com/866


동적 메모리 할당 방법

https://codingcoding.tistory.com/645


정수형 변수 int 배우기

https://codingcoding.tistory.com/704

댓글