포인터와 메모리 주소
지난 강의에서 배웠던 *
연산자는 특정 메모리 주소에 있는 값을 받아오게 해준다.
이 연산자를 이용해 포인터 역할을 하는 변수를 선언할 수도 있다.
아래 코드는 포인터 변수를 사용하여 변수 n
의 주소와 값을 출력한다.
#include <stdio.h>
int main(void)
{
int n = 50;
int *p = &n;
printf("%p\n", p);
printf("%i\n", *p);
}
정수형 변수 n
에는 50이라는 값이 저장되어 있다. 그리고 *p
라는 포인터 변수에 &n
이라는 값, 즉 변수 n
의 주소를 저장한다.
int *p
에서 p
앞의 *
는 이 변수가 포인터임을 나타내고 int
는 이 포인터가 int
타입의 변수를 가리킨다는 의미이다.
따라서 첫 번째 printf
문에서는 포인터 p
의 값, 즉 변수 n
의 주소를 출력하고 두 번째 printf
문에서는 포인터 p
가 가리키는 변수의 값, 즉 변수 n
의 값을 출력한다.
실제 컴퓨터 메모리에서 변수 p
는 아래와 같이 저장될 수 있다.
하지만, 추상적으로 생각하면 아래 그림과 같이 p
가 n
을 가리키고 있다는 것만 생각해도 된다.
이런 포인터를 기반으로 앞으로 배울 다양한 데이터 구조를 정의하고 사용할 수 있다.
포인터의 활용
포인터는 메모리 주소를 직접 다룰 수 있게 해주고 더 복잡한 데이터 구조와 동적 메모리 할당을 구현할 수 있다.
배열, 연결 리스트, 트리 등의 데이터 구조에서 포인터는 중요한 역할을 한다.
#include <stdio.h>
int main(void)
{
int arr[3] = {1, 2, 3};
int *p = arr;
for (int i = 0; i < 3; i++)
{
printf("%i ", *(p + i));
}
printf("\\n");
}
포인터를 사용해 배열 arr
의 요소들을 접근해 출력한다.
포인터 p
는 배열 arr
의 첫 번째 요소를 가리키고 *(p + i)
는 포인터 연산을 통해 배열의 각 요소에 접근한다.
포인터는 함수의 인자로 사용될 때도 유용하다. 함수가 호출된 위치에서 직접 값을 수정할 수 있다.
#include <stdio.h>
void increment(int *p);
int main(void)
{
int n = 5;
increment(&n);
printf("%i\n", n);
}
void increment(int *p)
{
(*p)++;
}
increment
함수는 포인터를 인자로 받아 값을 증가시킨다.
함수 내에서 *p
를 통해 포인터가 가리키는 실제 값을 변경하므로 main
함수에서 변수 n
의 값이 수정된다.
References
https://www.boostcourse.org/cs112/lecture/119028/?isDesc=false
'CSE > CS 기초' 카테고리의 다른 글
[CS50] 메모리 - 문자열 비교, 복사, 할당과 해제 (0) | 2024.06.17 |
---|---|
[CS50] 메모리 - 문자열 (0) | 2024.06.17 |
[CS50] 메모리 - 메모리 주소 (0) | 2024.06.14 |
[CS50] 알고리즘 - 재귀 (0) | 2024.06.14 |
[CS50] 알고리즘 - 버블 정렬 (1) | 2024.06.14 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!