728x90
1. pointer란?
★ 메모리의 주소를 가지고 있는 변수 = 변수의 주소를 가지고 있는 변수
★ 기계어나 어셈블리 언어처럼 메모리 주소를 가지고 직접 메모리의 내용에 접근 가능!
★ 데이터의 복사를 피하고 데이터를 공유하여 작업하고자 할때 사용
2. 주소 연산자 &
#include <stdio.h>
int main(void){
int num = 10;
//주소 연산자 & 사용
printf("num의 주소 : %u", &num);
return 0;
}
메모리 공간에 변수를 배치하는 것은 컴파일러의 권한이고 컴퓨터마다 주소는 달라진다.
%p | 주소를 출력하는 형식 지정자(16진수로 출력) |
%u | 부호가 없는 10진 정수로 출력 |
3. 포인터 변수 선언하기
★ "포인터 변수" 즉, 사용하기 전에 선언되어야 한다.
★ 포인터가 가리키게 되는 대상을 먼저 쓰고 *를 붙인 다음, 포인터 이름 작성
★ 포인터를 선언할 때 int *p; 또는 int* p; 라고 쓸 수 있다. 일반적으로 전자와 같은 방법을 사용한다.
#include <stdio.h>
int main(void){
int num = 10;
int *p = #
//포인터 p사용
printf("num의 주소 : %u\n", p);
return 0;
}
4. 간접 참조 연산자 *
★ 간접 참조(dereferencing, indirection)
★ 포인터 p가 가리키는 주소에 저장된 내용을 가져오려면 *p라고 하면 된다.
★ 즉, 포인터가 가리키는 위치에 있는 데이터를 가져오라는 의미
#include <stdio.h>
int main(void){
int num = 10;
int *p = #
printf("num의 주소 : %u\n", p);
printf("간접 참조 값: %d", *p);
return 0;
}
★ 위의 경우 *p 와 num 은 같은 값이다.
★ 이때 p는 p가 가리키는 위치에 무엇이 있는지를 모른다.
★ int *p; 일 경우 p가 가리키고 있는 주소에서 int가 있다고 가정하고 4byte를 읽어들인다.
int형일 경우 p가 가리키고 있는 주소에서 4byte만큼 읽어온다.
char | 1byte |
int | 4byte |
float | 4byte |
double | 8byte |
5. 포인터 사용시 주의할점
- 초기화하지 않고 사용하는 것은 위험하므로 아무것도 가리키고 있지 않을 때 NULL(0)로 설정한다.
- 포인터 타입과 변수 타입은 일치해야 한다. → 일치하지 않으면 컴파일 오류 발생
- 메모리는 운영체제의 고유 권한이므로 포인터 사용시 절대 주소 사용은 특수한 경우에만 한다.
6. 포인터 사용의 장점
- 연결리스트나 이진 트리 등의 향상된 자료구조를 만들 수 있다.
- 메모리 매핑 하드웨어(memory mapped hardware) : 메모리처럼 접근할 수 있는 하드웨어 장치 를 사용할 수 있다.
- 참조에 의한 호출 : 포인터 매개변수를 통하여 외부의 변수나 배열에 접근하여 값을 변경할 수 있다.
- 동적 메모리 할당 : 프로그램이 실행 도중에 운영체제로부터 메모리를 실시간으로 할당 받는 기법 을 사용할 수 있다.
728x90
'Language > C' 카테고리의 다른 글
[C언어] 기본 문법 정리 (0) | 2023.03.22 |
---|---|
[C언어] MAC에서 Visual Stdio Code로 C언어 실행하기 (0) | 2023.03.13 |