본문 바로가기
언어/C

[C언어] 포인터

by 새벽물망초 2022. 4. 16.

1. 변수의 생성

변수는 컴퓨터의 메모리에 생성

보통 변수는 num1과 같이 이름으로 사용하지만 메모리의 특정 장소에 위치하고 있으므로 메모리 주소로도 표현할 수 있습니다.

 

 

2. 

#include <stdio.h>

int main()
{
    int num1 = 10;

    printf("%p\n", &num1);    // 008AF7FC: num1의 메모리 주소를 출력
                              // 컴퓨터마다, 실행할 때마다 달라짐

    return 0;
}

변수의 메모리 주소를 구할 때는 변수 앞에 & (주소 연산자)를 붙이면 됩니다.

num1 앞에 &를 붙여서 변수 num1의 메모리 주소를 구했습니다.

 

 

3. 

메모리 주소는 포인터(pointer) 변수에 저장

포인터 변수는 *를 사용하여 선언합니다(포인터 변수는 포인터로 줄여서 부르기도 합니다)

#include <stdio.h>

int main()
{
    int *numPtr;      // 포인터 변수 선언
    int num1 = 10;    // int형 변수를 선언하고 10 저장

    numPtr = &num1;   // num1의 메모리 주소를 포인터 변수에 저장

    printf("%p\n", numPtr);    // 0055FC24: 포인터 변수 numPtr의 값 출력(즉, num1의 메모리 주소)
                               // 컴퓨터마다, 실행할 때마다 달라짐
    printf("%p\n", &num1);     // 0055FC24: 변수 num1의 메모리 주소 출력
                               // 컴퓨터마다, 실행할 때마다 달라짐

    return 0;
}

numPtr은 10이 저장된 메모리 공간을 가리킵니다. 즉, 변수 num1이 있는 공간을 가리키게 되는 것이죠.

 

 

 

4. 역참조 연산자

포인터 변수에는 메모리 주소가 저장되어 있습니다.

이때 메모리 주소가 있는 곳으로 이동해서 값을 가져오고 싶다면 역참조(dereference) 연산자 *를 사용

#include <stdio.h>

int main()
{
    int *numPtr;      // 포인터 변수 선언
    int num1 = 10;    // 정수형 변수를 선언하고 10 저장

    numPtr = &num1;   // num1의 메모리 주소를 포인터 변수에 저장

    printf("%d\n", *numPtr);    // 10: 역참조 연산자로 num1의 메모리 주소에 접근하여 값을 가져옴

    return 0;
}
10

역참조 연산자 *포인터 앞에 붙입니다.

다음과 같이 numPtr 앞에 *를 붙이면 numPtr에 저장된 메모리 주소로 가서 값을 가져옵니다.

여기서는 numPtr num1의 메모리 주소를 저장하고 있으므로 num1의 값인 10이 출력됩니다.

 

 

이번에는 포인터 변수에 역참조 연산자를 사용한 뒤 값을 저장(할당)해보겠습니다.

#include <stdio.h>

int main()
{
    int *numPtr;      // 포인터 변수 선언
    int num1 = 10;    // 정수형 변수를 선언하고 10 저장

    numPtr = &num1;   // num1의 메모리 주소를 포인터 변수에 저장

    *numPtr = 20;     // 역참조 연산자로 메모리 주소에 접근하여 20을 저장

    printf("%d\n", *numPtr);    // 20: 역참조 연산자로 메모리 주소에 접근하여 값을 가져옴
    printf("%d\n", num1);       // 20: 실제 num1의 값도 바뀜

    return 0;
}
20
20

역참조 연산자는 값을 가져올 수도 있고 값을 저장할 수도 있습니다

numPtr에 저장된 메모리 주소에 접근하여 20을 저장했습니다. 따라서 printf *numPtr을 출력해보면 20이 나옵니다.

 

또 한가지 중요한 점은 *numPtr = 20;으로 20을 저장한 뒤 printf로 변수 num1의 값을 출력해보면 20이 나온다는 것입니다. 왜냐하면 numPtr에는 num1의 메모리 주소가 저장되어 있으므로 역참조 연산자로 값을 저장하면 결국 num1에 저장하게 됩니다.

 

출처

https://dojang.io/mod/page/view.php?id=276 

 

C 언어 코딩 도장: 34.2 역참조 연산자 사용하기

포인터 변수에는 메모리 주소가 저장되어 있습니다. 이때 메모리 주소가 있는 곳으로 이동해서 값을 가져오고 싶다면 역참조(dereference) 연산자 *를 사용합니다. dereference.c #include int main() { int *num

dojang.io

 

 

 

흥달쌤 깨알c언어 포인터 문제1

#include <stdio.h>

void main() {
        int a = 10, b;
	int *c = &b;
    
    b = a--;
    b += 20;
    printf("%d", *c);
}

변수 a = 10, b 선언

포인터 변수 c 선언하고 b의 주소 저장함

b = a--, b=10 (다음 문장 실행부턴 b=9)

b = b + 20 = 9 + 20 = 29

*c를 출력하면 29

인줄 알았다면 틀렸다.

b = a-- 을 잘 보면, 1. b에다가 a의 값을 집어 넣고 2. 그다음 a-- 를 수행한다 (후위연산자)

따라서 1. b=10이 들어가고, 2. a-- 에 의해 a=9 가 된다

b = b + 20 = 10 + 20 = 30

정답 : 30

 

https://www.youtube.com/watch?v=Miz0QVEgPc0&t=756s&ab_channel=%ED%9D%A5%EB%8B%AC%EC%8C%A4 

 

'언어 > C' 카테고리의 다른 글

[C언어] 비트연산자  (0) 2022.07.21
[C언어] 사용자 정의 함수  (0) 2022.07.11
[C언어] 정보처리기사 프로그래밍 문제 풀이  (0) 2022.02.10
1주 ~ 7주 정리  (0) 2021.04.23
조건과 반복  (0) 2021.04.09

댓글