크래프톤 정글 6기 TIL - Day 17 | 포인터(pointer), & 연산자와 * 연산자
by 브이담곰
⚠️원서 내용을 한국어로 정리 해본거라, 약간의 직역이 있을 수 있습니다ㅠㅠ ⚠️
포인터 변수(Pointer Variable)
주 메모리는 바이트 단위로 구성되어 있다.
각각의 bytes들은 8개의 bits(비트)로 이루어져 있다.
실행 가능한 프로그램(executable program)은 code(코드)와 data(변수들)로 이루어져있다.
code : 기계 단위 명령
data: 변수
프로그램의 모든 변수들은 메모리에서 한 개 이상의 바이트를 차지한다.
포인터 변수의 정의
주소를 숫자로 표현해주기는 하지만 그 값은 정수와는 다르다! 일반적인 정수형 변수에 저장할 수 없다.
따라서 특수한 포인터 변수 pointer variable에는 저장해줄 수 있다.
포인터 변수 선언
int *p;
int* p; /* 역자: 포인터는 이름 앞에 붙기 보다는 형에 붙는 것이 좀 더 가독성에 도움이 된다 */
p가 int형을 갖는 개체를 가리키는 포인터 변수. → p는 변수가 아닌 메모리 공간을 가리킬 수 있기 때문.
2 주소 및 참조 연산자
C에서는 Pointer을 위한 특별한 연산자를 제공한다.
&( address ) 연산자
X → 변수 &X → X의 메모리에서의 주소
* ( indirection ) 연산자
P → 포인터 *P → P가 가리키는 Object
주소 연산자
포인터 변수의 선언은 포인터를 위한 공간은 설정해주나 어떤 개체를 가리키게 하지 않는다.
int* p; /* 가리키는 대상 없음 */
p를 사용하기 전에는 반드시 초기화를 해주어야 한다.
int i;
int* p;
…
p = &i;
참조 연산자
포인터 변수가 개체를 가리키고 있다면 *(참조) 연산자를 통해 개체가 어떤 값을 갖는지 접근할 수 있다.
printf("%d\n", *p);
[!!!]
초기화하지 않은 포인터 변수에 참조 연산자를 절대 사용하면 안된다.
int* p;
printf("%d", *p); /*** 잘못됨 ***/
int* p;
*p = 1; /*** 잘못됨 ***/
3 포인터 할당
C는 형만 같다면 할당 연산자가 포인터를 복사하는 것을 허용한다.
4 입력변수로서 포인터
함수 인자를 통해 함수 내부에서 값을 변경하려고 할 때, 일반 변수로 전달한다면 값 변경으로부터 보호되는 문제가 있다.
이를 포인터로 해결 가능하다.
&X로 X에 대한 포인터를 전달한다. → *P 해당 값에 접근해서 수정가능하다.
const로 입력변수 보호하기
함수에 변수에 대한 포인터를 전달해주면 보통 함수가 변수의 값을 수정한다고 이해할 수 있다.
f(&x);
하지만 그런 의도가 아니라면! const를 이용해서 f가 x값을 수정하지 않고 x값만 사용할 수 있게 해줄 수 있다.
포인터가 효율성이 뛰어난 이유는 만약 변수가 큰 저장 공간을 필요로 한다면 변수의 값에 의한 전달은 시간과 공간을 과도하게 많이 사용하기 때문이다.
const라는 키워드를 통해서 개체의 주소가 함수에 전달 될 때, 해당 개체가 바뀌지 않음을 문서화 해줄 수 있다.
void f(const int* p)
{
*p = 0; /*** 컴파일 오류 ***/
}
이렇게 const를 써주면 p라는 포인터가 "상수 정수형"을 가리킨다고 해석해준다. *p를 수정하려고 하는 것은 컴파일러가 잡아주기에 컴파일 에러가난다.
(역자: const는 모든 것에 써주고 필요한 곳에 빼는 게 맞는 습관이다. 단, 반환할 땐 포인터에만 써주자)
5 반환값으로서 포인터
함수에 포인터를 전달할 수 있을 뿐만 아니라 포인터를 반환return하는 함수를 작성해줄 수도 있다.
int* get_max(int* left, int* right)
{
if (*left > *right) {
return left;
} else {
return right;
}
}
'KRAFTON JUNGLE > JUNGLE TIL' 카테고리의 다른 글
크래프톤 정글 6기 TIL - Day 19 | B 트리 (0) | 2024.07.30 |
---|---|
크래프톤 정글 6기 TIL - Day 18 | 포인터와 배열 (0) | 2024.07.27 |
크래프톤 정글 6기 TIL - Day 16 | Knapsack Problem (0) | 2024.07.20 |
크래프톤 정글 6기 TIL - Day 15 | DP, 그리디, LCS (1) | 2024.07.19 |
크래프톤 정글 6기 TIL - Day 14 | 다익스트라, 플로이드 와샬 (3) | 2024.07.16 |
블로그의 정보
농담곰담곰이의곰담농
브이담곰