728x90
(1) 포인터, 포인터 변수
- 포인터(pointer)는 변수의 주소를 말한다.
- 변수의 주소를 저장할 때 사용하는 변수를 포인터 변수라고 한다.
- 간접 연산자 *는 "포인터 선언"의 의미와, "해당 포인터가 가리키는 주소의 실제 값"이란 두 가지 의미로 해석한다.
(2) 포인터 변수 선언
- 포인터 변수를 선언할 때는 자료형, 간접 연산자 *, 변수명을 붙인다.
int *a;
// a는 int형 포인터 변수이다.
- 포인터 변수에 주소를 저장하기 위해, 변수의 주소를 찾을 때는 변수 앞에 번지 연산자 &을 붙인다.
a = &b;
// 변수 b의 주소를 변수 a에 저장한다.
- 실행문에서 포인터 변수에 간접 연산자 *를 붙이면, 해당 포인터 변수가 가리키는 주소의 값을 의미한다.
c = *a;
// 변수 c는 포인터 변수 a가 가리키는 주소(b의 주소)가 가리키는 값을 의미한다.
- 포인터 변수는 힙 영역에 접근하는 동적 변수이다.
- 메모리 영역
- 코드 영역 : 실행할 프로그램의 코드를 저장
- 데이터 영역 : 전역 변수와 정적 변수를 저장
- 힙 영역 : 필요에 의해 동적으로 할당되는 여역
- 스택 영역 : 함수의 매개 변수와 지역 변수를 저장
(3) 포인터를 사용하는 이유
C언어는 메모리에 직접 접근하여 데이터를 사용할 수 있는 언어이다.
변수를 사용해 메모리에 접근하고자 변수 선언으로 메모리에 공간을 확보하고, 데이터를 넣고 꺼내는 공간으로 사용한다.
변수를 사용하는 가장 쉬운 방법은 변수명을 쓰는 것이고, 이 변수명은 메모리 공간을 식별한다.
그러나 선언된 블록, 즉 함수 내부에서만 해당 변수를 사용할 수 있기에, 같은 변수명이라도 블록이나 함수가 다르면 별도의 공간을 확보하므로 전혀 다른 변수로 사용한다.
이 때, 변수 대신 메모리의 주소값을 이용해 메모리에 접근하는 포인터를 사용하면, 사용 범위가 달라도 데이터를 공유할 수 있다.
하지만 포인터를 사용하려면 추가적인 변수 선언이 필요하고 주소 연산, 간접 참조 연산 등 각종 연산을 수행해야 한다.
굳이 포인터를 사용할 필요까진 없다.
(4) 예제
int a = 100;
// a의 주소는 4이다. (가정)
int *b;
// 포인터 변수 b를 선언
b = &a;
// 변수 a의 주소 4를 포인터 변수 b에 저장한다.
int c = *b;
// *b는 포인터 변수 b가 가리키는 주소(a의 주소)의 값을 의미한다.
// 따라서 c를 출력하면 100이 나온다.
- &a는 변수 a의 주소를 말한다. 즉, &a는 4이다.
- 4번지 주소에는 100이란 값이 저장되어 있다.
- 포인터 변수 b는 변수 a의 주소를 기억하고 있다. (b = &a)
- *b는 b에 저장된 주소가 가리키는 곳에 저장된 값을 말하므로, 100이다.
(5) 포인터와 배열
- 배열을 포인터 변수에 저장한 후, 포인터를 이용하여 배열의 요소에 접근할 수 있다.
int a[5];
int *b;
- 배열 위치를 나타내는 첨자를 생략하고 배열의 대표명만 지정하면, 배열의 첫번째 요소의 주소를 지정하는 것과 같다.
b = a;
// 배열 a의 시작 주소인 a[0]의 주소를 포인터 변수 b에 저장한다.
- 배열 요소에 대한 주소를 지정할 때는 일반 변수와 동일하게 & 연산자를 사용한다.
b = &a[2];
// 배열 a의 세 번째 요소인 a[2]의 주소를 포인터 변수 b에 저장한다.
- 배열의 요소가 포인터인 포인터형 배열을 선언할 수 있다.
a[0] a[1] a[2] a[3] a[4]
*(a+0) *(a+1) *(a+2) *(a+3) *(a+4)
- a는 배열의 시작 주소가 저장되어 있다.
- a의 값을 1 증가시키는 것은, 현재 a가 가진 주소에서 다음 주소를 가리킨다는 의미이다.
- a는 정수형 자료이고, 정수형 자료의 크기는 4바이트 이므로, a가 1 증가한다는 것은 4바이트 증가한 다음 주소를 가리키는 것이다.
- 이와 같이 p가 char형 배열의 주소를 가지고 있다면, 포인터가 1 증가할 때 메모리의 주소도 1바이트 증가한 주소를 가리킨다.
🍉 참고
반응형
'Language > C' 카테고리의 다른 글
[C언어] 구조체 (2) | 2024.04.15 |
---|---|
[C언어] 자료형 (1) | 2024.04.15 |
[C언어] 변수 (2) | 2024.04.14 |
[C언어] #include <stdio.h>란 (2) | 2024.04.12 |
[C언어] C 프로그래밍을 위한 환경 (Visual Studio 설치) (0) | 2024.04.12 |