728x90
포인터(Pointer)
: 프로그래밍 언어에서 다른 변수의 메모리 주소를 가리키는 변수
- 다른 언어와는 차별화된 C만의 특징
- 포인터를 이용하면 직접 메모리 내용에 접근하여 조작할 수 있다.
- 포인터는 메모리의 주소를 의미한다.
- 포인터 변수는 메모리의 주소 값을 저장하는 변수이다.└ (데이터가 저장된 곳, 즉 메모리 주소를 가진다.)
- 메모리 매핑 하드웨어
: 외부 장치를 메모리처럼 접근할 수 있다.
- 참조에 의한 호출
: 함수 외부 변수의 수정과 여러 개의 값을 반환할 수 있다.
- 동적 메모리 할당
: 프로그램 실행 도중 메모리를 할당할 수 있다.
변수와 메모리
- 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다.
- char 형 변수 : 1바이트
- int 형 변수 : 4바이트
변수의 주소
- & : 변수의 주소를 계산하는 연산자
#include <stdio.h>
int main(void)
{
int i = 10;
char c = 69;
float f = 12.3;
printf("i의 주소: %u\n", &i); // 변수 i의 주소 출력
printf("c의 주소: %u\n", &c); // 변수 c의 주소 출력
printf("f의 주소: %u\n", &f); // 변수 f의 주소 출력
return 0;
}
포인터 변수
: 변수의 주소를 가지고 있는 변수
int *p; //포인터 변수의 선언
- 포인터와 변수의 연결
char c = 'A'; // 문자형 변수 c
float f = 36.5; // 실수형 변수 f
double d = 3.141592; // 실수형 변수 d
char *pc = &c; // 문자를 가리키는 포인터 pc
float *pf = &f; // 실수를 가리키는 포인터 pf
double *pd = &d; // 실수를 가리키는 포인터 pd
Ex1
#include <stdio.h>
int main(void)
{
int i = 10;
double f = 12.3;
int *pi = NULL;
double *pf = NULL;
pi = &i;
pf = &f;
printf("%u %p\n", pi, i);
printf("%u %p\n", pf, f);
return 0;
}
💡변환 명세 %u 는 부호없는 10진수를 출력하고
%p 는 포인터의 주소(16진수)를 출력한다.
(주소값의 경우 음의 정수값을 가질 수 있으므로 '%u'를 이용하여 이를 방지한다.)
포인터 연산
- 증감 연산 시, 데이터 타입에 따른 메모리 값을 더하거나 뺀다.
Ex2. 포인터 변수의 증감 연산
#include <stdio.h>
int main(void) {
char *pc;
int *pi;
double *pd;
// 변수를 포인터형 변수로 선언했으므로
// 할당 정수 값 '10000'을 각 데이터 타입에 맞춰 타입 캐스팅 해줌
pc = (char *)10000;
pi = (int *)10000;
pd = (double *)10000;
printf("증가 전 pc = %d, pi = %d, pd = %d\n", pc, pi, pd);
pc++;
pi++;
pd++;
printf("증가 후 pc = %d, pi = %d, pd = %d\n", pc, pi, pd);
printf("pc+2 = %d, pi+2 = %d, pd+2 = %d\n", pc+2, pi+2, pd+2);
return 0;
}
💡 int 형과 *int 형은 서로 다른 자료형이다!
간접 참조 연산자(*)
: 포인터가 가리키는 값을 가져오는 연산자
int i=10;
int *p;
p =&i;
printf(“%d”, *p):
- & 연산자: 변수의 주소를 반환
- * 연산자: 포인터가 가리키는 곳의 내용 반환
Ex3
#include <stdio.h>
int main(void)
{
int i = 3000;
int *p=NULL;
p = &i;
printf("i = %d\n", i); // 변수의 값 출력
printf("&i = %u\n\n", &i); // 변수의 주소 출력
printf("p = %u\n", p); // 포인터의 값 출력
printf("*p = %d\n", *p); // 포인터를 통한 간접 참조 값 출력
return 0;
}
Ex4
#include <stdio.h>
int main(void)
{
int i=10;
int *p;
p = &i;
printf("i = %d\n", i);
*p = 20;
printf("i = %d\n", i);
return 0;
}
Ex5. 간접 참조 연산자와 증감 연산자
#include <stdio.h>
int main(void)
{
int i = 10;
int *pi = &i;
printf("i = %d, pi = %p\n", i, pi);
(*pi)++;
printf("i = %d, pi = %p\n", i, pi);
printf("i = %d, pi = %p\n", i, pi);
*pi++;
printf("i = %d, pi = %p\n", i, pi);
return 0;
}
포인터 사용시 주의점
- 초기화 안된 포인터를 사용하면 안된다.
int main(void)
{
int *p;
*p = 100;
return 0;
}
└ 메모리가 어디를 참조하는지 알 수 없어, 프로그램에 치명적인 결과를 발생시킬 수 있다.
💡 NULL 포인터로 간접 참조를 하게 되면 하드웨어로 감지한다.
- 포인터의 타입과 변수의 타입은 일치해야 한다.
#include <stdio.h>
int main(void)
{
int i;
double *pd;
pd = &i; // ERROR!
// double형 포인터에 int형 변수의 주소를 대입
*pd = 36.5;
return 0;
}
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
728x90
'🧑💻 Language > C·C++' 카테고리의 다른 글
[C 이론] 13. 문자와 문자열(1) (0) | 2021.06.05 |
---|---|
[C 이론] 12. 포인터(2) (0) | 2021.06.01 |
[C 이론] 10. 배열 (0) | 2021.05.26 |
[C 이론] 9. 함수와 변수 (0) | 2021.05.13 |
[C 이론] 8. 함수 (0) | 2021.05.06 |