๐Ÿ‘‰๐Ÿป C_Pointer_CheatSheet_v1

A Yeon Jangยท2025๋…„ 8์›” 6์ผ

๐Ÿ‘‰๐Ÿป C_Pointer_CheatSheet_v1

โ‰๏ธ Pointer๋ž€ ?

๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๋ฃŒํ˜•์œผ๋กœ C์–ธ์–ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ๊ฐ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ณ„ํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ณดํ†ต ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ, ํฌ์ธํ„ฐ๋Š” ์ฃผ์†Œ(๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜)๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
์ฆ‰, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” "์–ด๋””์— ์ €์žฅ๋ผ ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ์–ต"ํ•˜๋Š” ๋…€์„์ด๋‹ค!

๐Ÿ  ์ฃผ์†Œ๋ž€?

๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๊ฐ’์ด๋ž€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

C์–ธ์–ด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 1๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋ฉฐ,
๋ณ€์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๋”๋ผ๋„, "๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์˜ ์ฃผ์†Œ"๋งŒ์„ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.


๐Ÿ’ก ์˜ˆ์‹œ

#include <stdio.h>

int main() {
    int a = 1234;
    printf("๋ณ€์ˆ˜ a์˜ ์ฃผ์†Œ: %p\n", &a);
    return 0;
}

๋งŒ์•ฝ intํ˜•์ด 4๋ฐ”์ดํŠธ๋ผ๋ฉด,
a๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์ฒ˜๋Ÿผ 4์นธ์„ ์ฐจ์ง€ํ•˜๋”๋ผ๋„:

๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ   :   0x100   0x101   0x102   0x103
๋‚ด์šฉ (a ์ €์žฅ) :    ??      ??      ??      ??

&a๋Š” ํ•ญ์ƒ ๊ฐ€์žฅ ์ฒซ ์ฃผ์†Œ์ธ 0x100 ๋งŒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค!


๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์‹œ

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์‹œ (int a = 1234)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ์ฃผ์†Œ: 0x100    โ”‚ โ—€โ”€โ”€โ”€ &a
โ”‚ ๊ฐ’:   0xD2    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ์ฃผ์†Œ: 0x101    โ”‚
โ”‚ ๊ฐ’:   0x04     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ์ฃผ์†Œ: 0x102    โ”‚
โ”‚ ๊ฐ’:   0x00    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ์ฃผ์†Œ: 0x103    โ”‚
โ”‚ ๊ฐ’:   0x00    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ฐธ๊ณ ๋กœ ์œ„ ์˜ˆ์‹œ๋Š” Little Endian ๋ฐฉ์‹์ผ ๋•Œ์˜ ๋ฐ”์ดํŠธ ์ €์žฅ ๋ชจ์Šต์ด๋‹ค.
(C์–ธ์–ด๋Š” ๋ณดํ†ต Little Endian ์‹œ์Šคํ…œ์—์„œ ๋Œ์•„๊ฐ)


๐Ÿ†š ๋ณ€์ˆ˜ vs ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ๋น„๊ต

ํ•ญ๋ชฉ์ผ๋ฐ˜ ๋ณ€์ˆ˜ (์˜ˆ: int a = 10;)ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ (์˜ˆ: int *p = &a;)
โญ๏ธ ์˜๋ฏธ์ •์ˆ˜ํ˜• ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜
์„ ์–ธ ๋ฐฉ์‹int a;int *p;
์‚ฌ์šฉ ์˜ˆa = 10;p = &a;
โญ๏ธ ๊ฐ’10a์˜ ์ฃผ์†Œ (์˜ˆ: 0x7ffe...)
์—ญ์ฐธ์กฐ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ*p๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์— ์ ‘๊ทผ

๐Ÿงช ์˜ˆ์ œ : ๊ธฐ๋ณธ ํฌ์ธํ„ฐ

#include <stdio.h>

int main() {
    int a = 10;      
    int *p = &a;     

    printf("a์˜ ๊ฐ’: %d\n", a);
    printf("*p์˜ ๊ฐ’: %d\n", *p);
    printf("a์˜ ์ฃผ์†Œ: %p\n", &a);
    printf("p์— ์ €์žฅ๋œ ์ฃผ์†Œ: %p\n", p);

    return 0;
}

a์˜ ๊ฐ’: 10
*p์˜ ๊ฐ’: 10
a์˜ ์ฃผ์†Œ: 0x7ffee70b54ac
p์— ์ €์žฅ๋œ ์ฃผ์†Œ: 0x7ffee70b54ac


๐Ÿงช ์˜ˆ์ œ : ํฌ์ธํ„ฐ๋กœ ๊ฐ’ ๋ณ€๊ฒฝ

#include <stdio.h>

int main() {
    int a = 5;
    int *p = &a;

    *p = 20;

    printf("a์˜ ์ƒˆ๋กœ์šด ๊ฐ’: %d\n", a);

    return 0;
}

a์˜ ์ƒˆ๋กœ์šด ๊ฐ’: 20


๐Ÿงฎ ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ

#include <stdio.h>

int main() {
    int arr[3] = {10, 20, 30};
    int *p = arr;

    for (int i = 0; i < 3; i++) {
        printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));
    }

    return 0;
}

arr[0] = 10, (p + 0) = 10
arr[1] = 20,
(p + 1) = 20
arr[2] = 30, *(p + 2) = 30

๐Ÿ’ก ์ž์ฃผ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋‚ด์šฉ:

  • arr[i]์™€ *(arr + i)๋Š” ๊ฐ™๋‹ค.
  • ๋ฐฐ์—ด ์ด๋ฆ„ arr์€ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค (int * ํ˜•์‹).

๐Ÿ” ํฌ์ธํ„ฐ ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ

int a = 10;
int *p = &a;

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   a    โ”‚โ”€โ”€โ”€โ”€โ”€โ–ถ โ”‚     10     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    โ–ฒ
    โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   p    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚
       ์ฃผ์†Œ ์ €์žฅ      โ–ผ
                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                โ”‚   &a (์ฃผ์†Œ)โ”‚
                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿšจ ํฌ์ธํ„ฐ ์‚ฌ์šฉ์‹œ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜

์‹ค์ˆ˜ ์ฝ”๋“œ๋ฌธ์ œ ์›์ธ
int *p; *p = 10;ํฌ์ธํ„ฐ ์ดˆ๊ธฐํ™” ์—†์ด ์‚ฌ์šฉ โ†’ segmentation fault
int *p = NULL; *p = 10;NULL ์ฃผ์†Œ๋ฅผ ์—ญ์ฐธ์กฐ โ†’ ํ”„๋กœ๊ทธ๋žจ ํฌ๋ž˜์‹œ
int *p; p = &a;&a์ฒ˜๋Ÿผ ์œ ํšจํ•œ ์ฃผ์†Œ๋ฅผ ๊ผญ ํ• ๋‹นํ•ด์•ผ ํ•จ

๐Ÿ“ฆ ํ•จ์ˆ˜ ์ธ์ž๋กœ ํฌ์ธํ„ฐ ์ „๋‹ฌ (Call by Reference)

#include <stdio.h>

void changeValue(int *x) {
    *x = 100;
}

int main() {
    int a = 10;
    changeValue(&a);
    printf("๋ณ€๊ฒฝ๋œ a: %d\n", a);
    return 0;
}

๐Ÿ’ก ํ•ต์‹ฌ:

  • ๊ฐ’ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ์ฃผ์†Œ ์ „๋‹ฌ
  • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์›๋ณธ ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ!

๐Ÿ“Œ ์ด์ค‘ ํฌ์ธํ„ฐ (Pointer to Pointer)

#include <stdio.h>

int main() {
    int a = 42;
    int *p = &a;
    int **pp = &p;

    printf("a = %d\n", a);
    printf("*p = %d\n", *p);
    printf("**pp = %d\n", **pp);

    return 0;
}

๐Ÿงณ void ํฌ์ธํ„ฐ

#include <stdio.h>

int main() {
    int a = 123;
    void *vp = &a;

    printf("int ๊ฐ’: %d\n", *(int *)vp);

    return 0;
}
  • void *๋Š” ์–ด๋–ค ์ž๋ฃŒํ˜•์ด๋“  ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ญ์ฐธ์กฐ ์‹œ ์บ์ŠคํŒ… ํ•„์š”!

๐Ÿ’ฐ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (malloc, free)

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *p = (int *)malloc(sizeof(int) * 5); // intํ˜• 5๊ฐœ ๊ณต๊ฐ„ ํ• ๋‹น

    for (int i = 0; i < 5; i++) {
        p[i] = i * 10;
        printf("p[%d] = %d\n", i, p[i]);
    }

    free(p); // ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

    return 0;
}

โš ๏ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ํŒ

์ƒํ™ฉํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
malloc/free ์Œ์ด ๋งž์ง€ ์•Š์Œํ•ญ์ƒ free()๋กœ ํ•ด์ œํ•ด์ฃผ๊ธฐ
free ํ›„ ๋‹ค์‹œ ์ ‘๊ทผfree(p); p = NULL; ์œผ๋กœ ์„ค์ •
๋ฐฐ์—ด ํฌ๊ธฐ ๋ณ€๊ฒฝ ํ•„์š”realloc() ์‚ฌ์šฉ ๊ณ ๋ ค

0๊ฐœ์˜ ๋Œ“๊ธ€