11.1 포인터란?
메모리 주소
바이트 단위 메모리 공간의 주소
데이터 주소
자료가 저장된 메모리 시작 주소
변수와 메모리
변수는 자료를 저장하므로 컴퓨터의 메모리에 저장
변수의 크기에 따라 차지하는 메모리 공간이 달라짐
주소 연산자 (&)
변수 이름 앞에 사용
해당 변수의 주소값 반환
형식 지정자
%p: 주소값을 16진수 형식으로 출력
%u: 부호 없는 10진수 형식으로 출력
포인터 (포인터 변수)
메모리 주소값을 저장하는 변수
변수 주소값을 저장하는데 사용
포인터 선언
int * p;
//정수를 가리키는 포인터p
포인터 초기화
& 연산자를 이용하여 변수의 주소를 계산하여 포인터에 대입
int i = 10;
int *p;
p = &i;
11.2 간접 참조 연산자 (*)
포인터의 이름이나 주소 앞에 사용
포인터가 가리키는 주소에 저장된 값 반환
int i = 10;
int *p;
p = &i;
printf("%d", *p);
int *pi = (int *)10000;
char *pc = (char *)10000;
double *pd = (double *)10000;
& 연산자와 * 연산자
& 연산자: 변수의 주소를 반환
* 연산자: 포인터가 가리키는 곳의 내용을 반환
11.3 포인터 사용 시 주의할 점
- 초기화하지 않은 포인터의 사용
- NULL 포인터의 사용
- 포인터 타입과 변수 타입의 일치
- 절대 주소 사용
11.4 포인터 연산
증가, 감소, 덧셈, 뺄셈
포인터 타입 | 포인터 연산 |
char | 1 |
short | 2 |
int | 4 |
float | 4 |
double | 8 |
증감 연산
포인터가 가리키는 자료형의 크기만큼 증감
간접 참조 연산자와 증감 연산자
수식 | 의미 |
v = *p++ | p가 가리키는 값을 v에 대입한 후에 p를 증가한다. |
v = (*p)++ | p가 가리키는 값을 v에 대입한 후에 p가 가리키는 값을 증가한다. |
v = *++p | p를 증가시킨 후에 p가 가리키는 값을 v에 대입한다. |
v = ++*p | p가 가리키는 값을 가져온 후에 그 값을 증가하여 v에 대입한다. |
포인터의 형 변환
명시적으로 포인터의 타입을 변경
double f;
double* pd = &f;
int* pi;
pi = (int*)pd;
11.5 포인터와 함수
함수 호출 시 인수 전달 방식
값에 의한 호출(call-by-value): 복사본이 전달
참조에 의한 호출(call-by-reference): 주소값이 전달
scanf() 함수
변수에 값을 저장하기 위하여 변수의 주소를 받는다.
11.6 포인터와 배열
배열 이름
배일 이름 자체가 포인터 (포인터 상수)
첫 번째 배열 원소의 주소
포인터를 배열처럼 사용
int a[] = { 10, 20, 30, 40 };
int* p;
p = a;
일반 매개변수 vs 배열 매개변수
// 일반 매개변수 void sub(int x) { ... } |
// 배열 매개변수 void sub(int b[], int size) { ... } |
배열 매개변수
배열 매개변수에 기억 장소가 할당되지 않음
외부에서 전달된 배열의 주소를 저장하는 포인터
11.7 포인터 사용의 장점
향상된 자료 구조 작성
메모리 매핑 하드웨어
참조에 의한 호출
동적 메모리 할당
'잠든 카테고리 > 쉽게 풀어쓴 C언어 Express' 카테고리의 다른 글
13-13.1(구조체란 무엇인가?)~13.9(typedef) (0) | 2022.06.14 |
---|---|
12-12.1(문자와 문자열)~12.7(문자열 여러 개를 저장하는 방법) (0) | 2022.06.14 |
10-10.1(배열이란?)~10.6(2차원 배열) (0) | 2022.06.10 |
09-9.1(변수의 속성)~9.8(순환 호출)+Advanced Topic (0) | 2022.06.10 |
08-8.1(함수란?)~8.7(함수를 사용하는 이유)+Advanced Topic (0) | 2022.06.09 |