개요
포인터는 변수 혹은 함수의 주소값을 가지고있는 자료형이다. 즉 포인터는 주소 그 자체라고 할 수 있다.
따라서 포인터를 통해 메모리상의 특정 위치에 직접 접근하고 데이터를 조작할 수 있다.
오늘은 포인터의 개념과 선언 및 초기화, 사용법에 대해 알아보자
포인터란 무엇인가?
포인터는 변수나 함수가 저장된 메모리 주소를 가리키는 변수이다. 일반적인 변수는 특정 데이터를 저장하지만, 포인터는 다른 변수나 함수의 메모리 주소를 저장한다.
먼저 변수는 메모리의 실제 데이터가 있는 파트에 기록되며 주소목록파트의 주소를 가진다. (이전 글 참조)
2024.05.04 - [프로그래밍/C언어] - C언어 - 변수와 자료형
C언어 - 변수와 자료형
오늘은 C언어의 변수와 자료형, 그 중에서도 기본 자료형에 대해 다뤄보고자 한다. 변수는 프로그램에서 사용자가 사용할 데이터이다. 프로그램의 데이터는 RAM 저장 공간에 임시적으로 할
carmen8740.tistory.com
포인터는 이 주소를 저장한다. 즉, 포인터는 다른 변수가 위치한 메모리 주소를 저장하고, 이를 통해 그 변수에 간접적으로 접근할 수 있다.
포인터 선언 및 초기화 방법
// 선언 방법 데이터형 *포인터변수명;
int a = 10; // 일반 변수
int *ptr = &a; // 포인터 변수: 'a'의 주소를 저장
보면 포인터도 일종의 자료형이기때문에 기존의 변수 선언 초기화 방법과 비슷한 맥락을 지녔다.
포인터를 선언할때는 *자료형 형식으로 선언하며 일반 변수의 주소값을 넣어줄때는 &를 붙여 주소를 넣어준다.
이때 포인터는 주소를 저장하는데 데이터형이 왜 필요한지 의문이 들 수 있다. 이는 자료형을 명시해 범위가 얼마인지를 지정하여 그 범위만큼을 제어하기 위해서이다.
*) ' * ' : 이 기호는 간접 참조 연산자 혹은 역 참조 연산자라고 부른다.
포인터를 통한 값 접근
#include <stdio.h>
int main()
{
int a = 5;
int *ptr = &a; // 'a'의 주소 저장
printf("a의 값: %d\n", *ptr); // 포인터를 통해 'a'의 값에 접근
return 0;
}
위처럼 포인터를 통해 주소가 가리키는 값에 접근할 수 있다.
포인터와 배열
배열에 관해서는 아래 포스트 참고
2024.06.30 - [프로그래밍/C언어] - C언어 - 배열 (array)
C언어 - 배열 (array)
개요배열은 동일한 자료형들을 묶어서 선언하고 더욱 효율적으로 자료형 묶음을 저장하고 관리한다.오늘은 이 배열의 종류, 선언과 초기화 및 사용법을 알아보자 1차원 배열1차원 배열은 행을
carmen8740.tistory.com
배열과 포인터는 매우 밀접한 관계가 있다. 배열은 배열의 첫 번째 요소의 주소를 가리키고 있기 때문이다. 따라서 일종의 포인터로 해석될 수 있으며 포인터를 사용하는 문법 대다수를 배열의 이름을 집어넣어 사용할 수 있다.
#include <stdio.h>
int main()
{
int arr[3] = {10, 20, 30};
int *ptr = arr; // 배열 이름은 배열의 첫 번째 요소의 주소를 가리킴
printf("첫 번째 요소: %d\n", *ptr); // arr[0]
printf("두 번째 요소: %d\n", *(ptr + 1)); // arr[1]
printf("세 번째 요소: %d\n", *(ptr + 2)); // arr[2]
return 0;
}
물론 배열의 이름은 const int* 처럼 일종의 상수화되어있는 주소값이기 때문에 저장된 주소값을 변경할 수는 없다.
포인터와 함수
함수의 매개변수에 포인터값을 집어넣어 지역변수 혹은 정적 지역 변수에 직접 접근하여 값을 수정할 수 있다.
기존의 일반 자료형을 매개변수로 사용한 함수는 Call By Value였다면 포인터를 사용한 함수는 Call By Reference로 운용할 수 있다.(이것이 Call By Reference 인지는 사람들끼리 얘기가 많이 나온다. 물론 중요한것은 개념이지 명칭이 아니니 신경쓰지 말자)
#include <stdio.h>
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 5, b = 10;
printf("교환 전: a = %d, b = %d\n", a, b);
swap(&a, &b); // 변수 'a'와 'b'의 주소를 함수에 전달
printf("교환 후: a = %d, b = %d\n", a, b);
return 0;
}
이중 포인터 (Double Pointer) 와 다중 포인터
이중 포인터는 포인터를 가리키는 포인터이다. 이는 다차원 배열이나 포인터 배열을 처리할 때 유용하게 사용되며, 포인터를 동적으로 관리할 때도 자주 활용된다. 물론 이중 포인터를 가르키는 포인터 그것을 가리키는 포인터...등등 끝도 없이 물고 늘어질 수 있으며 이중 이상은 다중 포인터라고 부른다.
#include <stdio.h>
int main()
{
int a = 5;
int *ptr = &a;
int **dptr = &ptr; // 이중 포인터: 'ptr'의 주소를 저장
printf("a의 값: %d\n", a);
printf("포인터를 통해 a의 값: %d\n", *ptr);
printf("이중 포인터를 통해 a의 값: %d\n", **dptr);
return 0;
}
결론
포인터는 C언어에서 가장 핵심적이며 강력한 도구이다. 사실상 C언어를 사용한다는것은 포인터를 자세하게 다루겠다는것이나 다름이 없다. 대부분의 핵심이자 기초적인 기능들이 포인터를 거쳐가는것이 굉장히 많기 때문이다.
사실 이 포인터는 처음 접했을때 이해가 어려울 수 있기때문에 입문자들의 첫 장애물이라고 생각한다. 그렇다는것은 이 장애물을 뛰어넘는다면 이전의 자신보다 더 성장한 자신을 볼 수 있을것이다. 포인터의 개념을 숙지하고 이해하며 더욱 실력을 정진시켜보자
'프로그래밍 > C언어' 카테고리의 다른 글
C언어 - 동적할당 (2) | 2024.10.22 |
---|---|
C언어 - 지역 변수와 전역 변수, 정적 변수 (0) | 2024.09.04 |
C언어 - 사용자 정의 자료형 (1) | 2024.09.03 |
C언어 - 함수 (2) | 2024.07.08 |
C언어 - 표준 입출력 스트림 (0) | 2024.07.06 |