1. 포인터와 포인터 변수
- 포인터 : 변수의 주소, C언어에서 주소를 제어할 수 있는 기능을 제공
- 포인터 변수
- 변수의 주소를 저장할 때 사용하는 변수
- 필요에 의해 동적으로 할당되는 메모리 영역인 힙 영역에 접근하는 동적 변수
- 포인터 변수의 선언 : 자료의 형을 먼저 쓰고, 변수명 앞에 간접 연산자 *를 붙임 (ex. int *a;)
- 포인터 변수에 주소를 저장할 때 : 변수의 주소를 알아낼 때는 변수 앞에 번지 연산자 &을 붙임 (ex. a = &b;)
- 실행문의 포인터 변수에 간접 연산자 *를 붙이면 해당 포인터 변수가 가리키는 곳의 값을 말함 (ex. c = *a;)
- 포인터 변수의 용도
- 연결된 자료 구조를 구성하기 위해 사용
- 동적으로 할당된 자료 구조를 지정하기 위해 사용
- 배열을 인수로 전달하기 위해 사용
- 문자열을 표현하기 위해 사용
- 커다란 배열에서 요소를 효율적으로 저장하기 위해 사용
- 메모리에 직접 접근하기 위해 사용
- 예제
main()
{
int a = 50; //➊ 정수형 변수 a를 선언하고 50으로 초기화
int *b; //➋ 정수형 변수가 저장된 곳의 주소를 기억할 포인터 변수 b를 선언
b = &a; //➌ 정수형 변수 a의 주소를 포인터 변수 b에 기억시킴. b에는 a의 주소가 저장됨
*b = *b+20; //➍ b가 가리키는 곳의 값에 20을 더함. b가 가리키는 곳이 a이므로 결국 a의 값도 바뀜
printf("%d, %d", a, *b); //➎ 결과 : 70, 70
// ➋와 같이 선언할 때 *는 해당 변수가 포인터 변수라는 것을 의미
// ➍, ➎와 같이 사용할 때 *를 붙이면 그 포인터 변수가 가리키는 곳의 값을 의미
}
<예제의 실행 과정에 따른 메모리의 변화>
- ➊, ➋번 수행
- 주기억장치의 빈 공간 어딘가에 a라는 이름을 붙이고 그 곳에 50을 저장
- ➌번 수행
- 변수 a의 주소가 b에 기억된다는 것은 b가 변수 a의 주소를 가리키고 있다는 의미
- ➍번 수행
- b가 가리키는 곳의 값에 20을 더해 다시 b가 가리키는 곳에 저장
- 그곳은 변수 a의 주소이므로 변수 a값도 저절로 변경되는 것
2. 포인터와 배열
- 배열을 포인터 변수에 저장한 후 포인터를 이용해 배열의 요소에 접근할 수 있음
- 배열 위치를 나타내는 첨자를 생략하고, 배열의 대표명만 지정하면 배열의 첫 번째 요소의 주소를 지정하는 것과 같음
- 배열 요소에 대한 주소를 지정할 때는 일반 변수와 동일하게 & 연산자를 사용
- 배열의 요소가 포인터인 포인터형 배열을 선언할 수 있음
- 예제
main()
{
int a[5]; //5개의 요소를 갖는 정수형 배열 a를 선언. 선언할 때 사용할 개수를 선언하고, 사용할 때는 첨자를 0부터 사용
int i; //정수형 변수 i를 선언
int *p; //➊
for (i = 0; i < 5; i++) //반복 변수 i가 0에서 시작하여 1씩 증가하면서 5보다 작은 동안 ➋번을 반복수행
a[i] = i + 10; //➋
p = a; //➌
for (i = 0; i < 5; i++) //반복 변수 i가 0에서 시작하여 1씩 증가하면서 5보다 작은 동안 ➍번을 반복하여 수행
printf("%d", *(p+i)); //➍
}
- ➊
- 정수형 변수가 저장된 곳의 주소를 기억할 정수형 포인터 변수 p를 선언
- ➋
- 배열 a의 i번째에 i+10을 저장, i는 0~4까지 변하므로 배열 a에 저장된 값은 다음과 같음
- ➌
- 배열명 a는 배열의 주소이므로 포인터 변수 p에는 배열 a의 시작 위치가 기억됨
- 배열의 이름은 주소이므로 'p = &a'처럼 입력하지 않도록 주의
- ➍
- p에 저장된 값은 정수형 배열의 시작 주소
- p의 값을 1 증가 시킨다는 것은 현재 p가 가리키고 있는 정수형 자료의 주소에서 다음 정수형 자료의 주소로 가리키는 주소로 증가시킴을 의미
- 정수형 자료의 크기는 4바이트이므로 다음 물리적 메모리의 주소는 4Byte 증가한 곳을 가리키는 것
- p에 저장된 배열의 시작 주소에서 1번지씩, 즉 4Byte씩 증가시키는 것을 그림으로 표현하면 다음과 같음
- p의 종류
- p+0 : 배열의 시작주소에 0을 더했으므로 배열 시작의 주소인 '1000'번지 그대로
- *(p+0) : '1000' 번지의 값은 10, 10을 출력
- p+1 : '1000'에서 한 번지 증가한 주소는 '1004' 번지
- *(p+1) : '1004' 번지의 값은 11, 11을 출력
- p+2 : '1000'에서 두 번지 증가한 주소는 '1008'번지
- *(p+2) : '1008'번지의 값은 12, 12를 출력
'Study > EIP' 카테고리의 다른 글
[정보처리기사 필기] 응용 SW 기초 기술 활용 - 118. 스케줄링 (0) | 2025.01.16 |
---|---|
[정보처리기사 필기] 프로그래밍 언어 활용 - 105. 구조체 (0) | 2025.01.15 |
[정보처리기사 필기] 프로그래밍 언어 활용 - 103. 배열과 문자열 (0) | 2025.01.15 |
[정보처리기사 필기] 프로그래밍 언어 활용 - 101. 제어문 (0) | 2025.01.15 |
[정보처리기사 필기] SQL 응용 - 085. DML - JOIN (0) | 2025.01.14 |