[C] Pointer
▶ 포인터란?
- Pointer(포인터)
- 메모리의 주소값을 저장하는 변수
- char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다.
▷ 포인터 선언과 초기화
-
p의 a값을 저장해보자!
-
a의 주소값을 저장하기 위해선 &(앰퍼샌드)연산자를 사용한다
- 즉, a의 값이 아닌 a의 주소 값을 저장할 수 있는 것이다.
-
주소값을 저장하는 변수라는 뜻으로 *연산자를 사용한다. -> 포인터
- 즉, 정수가 아니라 int형의 주소를 저장할 수 있는 것이다.
- 주소값을 저장하기 위해 당연히 메모리가 할당 될 것이다!
int *ptr = &a; // 포인터 선언과 초기화 동시에
-
-
예시
- 아래와 같을 때, ptr은 n을 참조하는 상황이다.
int n = 100; // 변수의 선언 int *ptr = &n; // 포인터의 선언 ptr = &a; // 포인터 초기화
- 위와 같은 상황에서 n, ptr, *ptr을 출력하면 어떤 값이 나올까?
- n : 100
- ptr : 0x12(n의 시작 주소)
- *ptr(역참조) : 100
▷ * 연산자
*
연산자가 헷갈린다..! 언제 쓰이는 거지?
*
의 용도 : 연산자, 포인터, 역참조
곱하기 | 포인터 | 역참조 |
---|---|---|
2 * p; | int * p p는 int형의 주소를 저장하는 포인터 |
*p |
* 연산자를 중심으로 피연산자가 수치값이나 변수로 이루어짐 | 좌측 피연산자에 무조건 자료형이 있음 | 단항 연산자로 쓰일 때 포인터가 가리키는 메모리에 접근하는 역참조로 쓰임 |
2 곱하기 p | p는 int형의 주소를 저장하는 포인터⭐ | p 역참조 |
띄어쓰기 따위 의미 없음!
int* p;
int *p;
int * p;
int*p;
포인터는 64bit 시스템에서 모든 자료형이 8bit인데 왜 포인터에 자료형이 있을까?
- 포인터가 갖고 있는 주소 값은 메모리의 시작 주소 값만 갖고 있기 때문에 포인터 역참조를 하기 위해 자료형이 필요하다.
✏️문제
포인터를 사용하여 a와 b의 출력 값을 바꿔보자!
#include <stdio.h>
void swap(int* a, int* b) {
int temp;
temp = * a;
*a = *b;
*b = temp;
}
int main()
{
int a=5;
int b=10;
swap(&a, &b);
printf("%d %d", a, b);
}
📎참조
- https://www.tcpschool.com/c/c_pointer_intro
- https://www.youtube.com/watch?v=bz63_WWtKc4
댓글남기기