[C, C++] 포인터

 

서늘한 이 감각, 이걸 또 보게 되다니 ㅠㅠ

포인터의 개념

  • 변수의 메모리 주소 값을 말한다. 이 포인터를 담는 변수를 포인터 변수라고 한다.
    • 포인터 변수가 어떤 변수의 주소를 저장하고 있다는 것은, 포인터 변수가 그 변수를 가리키고 있다를 의미한다.
    • 포인터 변수를 이용하여, 연결된 주소의 변수 영역을 액세스 할 수 있다.
    • 포인터 변수를 간단하게 포인터라고 부른다.

포인터의 사용 예제

int i;
int *ptr = &i;

자료형 *포인터이름;

자료형 : 포인터 자체의 자료형이 아니라 포인터에 저장 할 주소에 있는 일반 변수의 자료형을 적는다.
*포인터이름 : 일반 변수 이름과 구별되도록 앞에 *를 붙여 포인터임을 나타낸다.

포인터 연산자

주소 연산자 : &

  • 변수의 주소를 얻기 위해 사용한다
  • 주소 연산자의 사용 형식은 이와 같다.
pointer = &var;

참조 연산자 : *

  • 저장 된 주소에 있는 값을 액세스 하는 연산자이다.
  • 참조 연산자의 사용 형식은 이와 같다.
*pointer = value;
var = *pointer;

포인터의 초기화

  • 일반 변수를 초기화 하는 방법과 동일하다.
    • 포인터에 주소를 지정하는 방법
      • 주소 연산자를 사용하여 변수 주소를 지정한다.
        int i;
        int *ptr = &i;

      • 동적 메모리를 할당하고, 그 시작 주소를 포인터값으로 지정한다.
        char *ptr = (char *)malloc(100);

      • 문자열 포인터에 문자열의 시작 주소를 지정한다.
        char *ptr = "korea";

      • 배열 이름을 이용하여 배열 시작 주소를 지정한다.
        char A[100];
        char *ptr = &A[0];

포인터 배열

  • 포인터 자료형을 배열로 구성한다.
    • 선언 형식은 이렇게 생겼다.
int *pointerArr [size];

각 배열 요소는 포인터이다.
2차원 문자 배열을 1차원 포인터 배열로도 표현 할 수 있다.

char arr[3][10] = {
    "hello",
    "world",
    "C"
};

이 형태가 일반 적이었다고 하면 

char *arr[3] = {
    "hello",
    "world",
    "C"
};

이게 가능하다.

  • 2차원 배열
    • 배열이 선언 될 때 지정한 크기의 배열 공간이 메모리에 할당된다.
    • 한 번 할당된 배열의 크기를 줄이거나 늘리기 어렵다.
    • 처음 선언한 배열의 크기보다 실제 사용 공간이 작으면 메모리가 낭비된다.
    • 실제 필요한 공간이 할당 크기보다 크면 배열을 새로 만들어야 한다.
arr[3][10] [0] [1] [2] [3] [4] [5]    
Hello H e l l o EOL    
world w o r l d EOL    
C C EOL            

 

  • 1차원 포인터 배열
    • 저장하는 문자열의 길이에 따라 메모리가 할당된다.
    • 저장할 문자열의 길이를 정확히 예측 할 수 없거나,
      문자열의 길이가 자주 변하는 경우에 메모리를 좀 더 효율적으로 사용 할 수 있다.
*arr[3]                
[0]Hello H e l l o EOL    
[1]world w o r l d EOL    
[2]C C EOL            

포인터의 포인터

왜 있는거야

  • 포인터를 가리키고 있는 포인터. 이중 포인터이다.
  • 포인터의 주소를 가지고 있는 포인터이다.
  • 포인터의 포인터 선언 형식과 예는 이와 같다 :
int **ppttrr;

 

'컴퓨터 이론' 카테고리의 다른 글

포인터와 구조체 설명하기..  (2) 2025.04.11
Amortized Analysis : 분할 상환  (0) 2025.04.04
Greedy  (0) 2025.04.04
[PY] 글로 벌  (0) 2025.04.04
플로이드 워셜  (0) 2025.04.03