농담곰담곰이의곰담농

크래프톤 정글 6기 TIL - Day 17 | 포인터(pointer), & 연산자와 * 연산자

by 브이담곰

C언어 만드신 분이 쓰신 책을 참고해서 공부해보았다. 기존에 읽었었던 C책보다 훨씬 설명이 깔끔하고 좋았다. 자세하고!! 너무 맘에 들었당..

 

⚠️원서 내용을 한국어로 정리 해본거라, 약간의 직역이 있을 수 있습니다ㅠㅠ ⚠️

포인터 변수(Pointer Variable)

주 메모리는 바이트 단위로 구성되어 있다.

각각의 bytes들은 8개의 bits(비트)로 이루어져 있다.

 

실행 가능한 프로그램(executable program)은 code(코드)와 data(변수들)로 이루어져있다.

code : 기계 단위 명령

data: 변수

프로그램의 모든 변수들은 메모리에서 한 개 이상의 바이트를 차지한다.

포인터 변수의 정의

주소를 숫자로 표현해주기는 하지만 그 값은 정수와는 다르다! 일반적인 정수형 변수에 저장할 수 없다.

따라서 특수한 포인터 변수 pointer variable에는 저장해줄 수 있다.

포인터 p가 변수 i를 가리킨다.

 

포인터 변수 선언
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;
    }
}

 

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기