Home [C언어] 포인터
Post
Cancel

[C언어] 포인터

포인터의 개념

기본 형태

int *a; int형 포인터를 a로 선언한다는 뜻

*(asterisk)의 활용

  1. 포인터를 선언
  2. 해당 주소의 값에 접근 ← 중요!

예시

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
31
32
33
34
#include<stdio.h>

int main (void)
{
    int a = 42;		//변수 선언, 초기화
    int* ptr;		//int형을 가르키는 포인터 p 선언

    ptr = &a;		//포인터 p에 a의 주소를 저장

    printf("Integer* size : %d", sizeof(int*));
    printf("Float* size : %d", sizeof(float*));
    printf("Char* size : %d", sizeof(char*));
/* 출력결과
>>Char* size : 8
Integer* size : 8
Integer* size : 8
*/
//자료형에 상관없이 모든 포인터의 크기는 8바이트

    printf("value of 'ptr' is %d ", *ptr);
/* 출력결과
>>value of 'ptr' is 42
*/
//ptr 앞에 * 붙여서 값을 가져옴

    printf("address of 'a' is %x\n", &a);
    printf("address of 'a' is %x ", ptr);
/* 출력결과
>>address of 'a' is ff000bc4
address of 'a' is ff000bc4
*/
//ptr이 a의 주소를 가르키기 때문에 &a(a의 주소)를 쓰는것과 같은 의미
    return 0;
}

활용

포인터를 쓰지 않는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

void add(int a, int b)
{
  a++;
  b++;
}

int main()
{
  int a = 1;
  int b = 1;
  add(a, b);
  printf("a: %d, b: %d",a,b);
  return 0;
}

위와 같은 코드를 실행시키면 다음과 같은 결과를 출력한다.

a: 1, b: 1

add함수에 a와 b 변수를 인자로 넘겼지만 main함수에서의 a,b와 add함수의 a,b는 별개로 인식되기 때문이다.

포인터를 쓰는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

void add(int *a, int *b)
{
  (*a)++;
  (*b)++;
}

int main()
{
  int a = 1;
  int b = 1;
  add(&a, &b);
  printf("a: %d, b: %d",a,b);
  return 0;
}

이번에는 다음과 같이 add 함수를 호출할 때 a와 b의 주소값을 인자로 넘겼다.

a: 2, b: 2

add 함수는 매개변수로 포인터를 받기 때문에 포인터 각각을 역참조하여 더하게 되면 그 결과가 main함수의 각 변수에 반영됨을 알 수 있다.

Reference

https://youtu.be/A7C9-Ea_zBQ
https://dojang.io/mod/page/view.php?id=275

This post is licensed under CC BY 4.0 by the author.

[C언어] 전처리기

TIL 220119