Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 포인터 (Pointer) : 기본 개념 본문

C언어

C언어 - 포인터 (Pointer) : 기본 개념

깅햄찌 2022. 9. 7. 21:34
반응형

안녕하세요~ 오늘은 포인터에 대해서 정리해보려 합니다.

일단 포인터란 말 그대로 무엇을 가리키는 역할을 하는데요.

바로 메모리의 주소를 가르키는 방법입니다.

역시 글로는 와닿지 않으니 예시를 보며 포인터에 대해 알아보겠습니다~

 

'포인터'는 메모리의 주소를 가리키는 데 그럼 메모리의 주소는 무얼 의미할까요?

메모리의 주소란 변수가 할당된 메모리의 시작 주소를 의미합니다.

 

아래 코드를 작성해 변수 temp가 할당된 메모리 주소를 출력해보겠습니다!

#include <stdio.h>

int main(){
    int temp;
    printf("temp's memory address : %u", &temp);
    return 0;
}

변수 temp가 할당된 메모리 주소는 1291844428 인 것을 확인할 수 있습니다. 

 

아래는 이해하기 쉽게 temp가 할당된 메모리의 구조를 나타낸 것으로 temp는 int형이므로 4byte

즉 12..28부터 12..31번지 까지 할당된 것을 예상할 수 있습니다. 

12..28 12..29 12..30 12..31 12..32 12..33

 

자, 이제 본론으로 돌아가 포인터를 써서 메모리 주소에 접근해보겠습니다.

코드를 보기 전에 주소 연산자와 간접 참조 연산자에 간단히 알아보겠습니다. 

 

주소 연산자는 &로 &뒤에 변수를 붙여주면 변수의 주소값을 나타냅니다. 

간접 참조 연산자는 *로 자료형 + * + 포인터 이름과 같이 포인터를 선언하거나

ex) int *pt : pt라는 int형 포인터를 선언

* + 포인터 이름과 같이  포인터가 가리키는 변수에 접근할 수 있습니다. 

ex) *pt = 10 pt라는 포인터가 가리키는 변수에 10을 대입

 

주소 연산자와 간접 참조 연산자의 자세한 쓰임새는 아래 예제를 통해 다시 한번 정리해보십다!!

 

1. temp라는 int 변수 선언

2. temp_pointer 라는 int형 포인터 선언

3. temp의 주소를 temp_pointer에 할당한다. (temp_pointer를 통해 temp의 값에 접근할 수 있다)

4. temp_pointer가 가리키는 값 (temp)에 7을 할당한다. 

5. temp_pointer가 가리키는 값를 출력한다. 

6. temp를 출력한다. 

#include <stdio.h>

int main(){
    int temp;
    int *temp_pointer;

    temp_pointer = &temp; // allocate temp's address to temp_poninter
    *temp_pointer = 7; // allocate 7 to where temp_pointer pointing : temp

    printf("%d\n", *temp_pointer);
    printf("%d\n", temp);
}

temp_pointer가 가르키는 값, temp 모두 7을 출력하는 것을 알 수 있습니다.

이를 통해 포인터를 가르키는 변수의 시작 주소를 저장하는 걸 알 수 있습니다. 

 

포인터에 대한 추가 tips

 

포인터를 선언할 때 자료형과 간접 참조 연산자가 붙어있거나 떨어져 있어도 같은 기능을 합니다!

    int *temp_pointer;
    int* temp_pointer;

가리키는 자료형과 상관없이 항상 첫 번째 주소만 저장합니다. 

   char * temp_pointer;
   int *temp_pointer;
   double * temp_pointer;

포인터 변수 선언과 초기화 동시에 하는 방법

    int *temp_pointer = &temp;

const를 사용한 포인터 종류

const는 변수를 상수화 시키는 기능을 합니다. 

const를 사용한 포인터는 선언과 초기화가 동시에 이뤄져야 합니다. 

 

temp_pointer1는 상수 포인터로 포인터 변수가 상수입니다.

따라서 temp 이외의 주소 값을 temp_pointer1에 저장할 수 없습니다. 

 

temp_pointer2는 상수에 대한 포인터로 포인터 변수가 가리키는 값이 상수입니다.

따라서 temp_pointer2가 가르키는 값에 다른 변수 및 상수를 저장할 수 없습니다. 

(*temp_pointer2 = 10은 안되지만 temp = 10은 가능합니다!!)

 

temp_pointer3는 상수에 대한 상수 포인터로 상수 포인터 + 상수에 대한 포인터라고 할 수 있습니다. 

    int* const temp_pointer1 		= &temp;
    const int* temp_pointer2		= &temp;
    const int* const temp_pointer3	= &temp;

 

오늘은 포인터의 기본 개념을 알아보았습니다.

포인터는 정리해야 할게 정말 많네요ㅠ 여러 차례로 나누어 차근차근 알아보아요~

좋은 하루 보내세요~

Comments