C에서 어려운 포인터입니다. C는 low-level 언어라고 하는데 바로 이 포인터를 이용해 메모리에 직접 접근이 가능하기 때문에 low-level 언어라고 불립니다. 그렇다면 이 포인터는 과연 어떤 것일까요?
int num = 10; 즉 변수 num의 경우 int형이므로 4바이트가 메모리에 저장이 된다. 이 메모리의 주소 값을 임의로 0x123456부터 시작한다고 가정해보자. 이때 이 0x123456이라는 번지를 주소 값이라고 한다. 이 주소 값 역시 저장할 수 있는 값이며 포인터 변수는 메모리의 주소 값을 저장하기 위한 변수이다.
포인터 변수의 선언
이 포인터 변수의 선언은 매우 간단하다. 다음을 보자
int * pnum; // int 형 변수를 가리키는 포인터 변수 pnum
double * pnum2; // double 형 변수를 가르키는 포인터 변수 pnum2
float * pnum3; // float 형 변수를 가르키는 포인터 변수 pnum3
즉 저장하고자 하는 변수의 형에 따라 포인터 변수의 형 역시 정해진다.
& 연산자
& 연산자는 피연산자의 주소 값을 반환하는 연산자이다. 이를 다음의 예시를 통해 살펴보면 다음과 같다.
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
int main(void) {
int num = 7;
int* pnum;
pnum = # // num의 주소값을 &연산자를 통해 반환하여 포인터 변수 pnum을 초기화 한다.
return 0;
}
|
cs |
이때 변수의 형과 포인터 변수의 형은 일치해야 한다. 즉 다음의 경우는 오류가 발생할 수 있다.
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
int main(void) {
int num = 7;
double* pnum;
pnum = # // double 형 포인터 변수에 int형 변수의 주소값을 넣으려 하므로 오류 발생
return 0;
}
|
cs |
* 연산자
* 연산자는 포인터가 가리키는 메모리 공간에 접근할 때 사용하는 연산자이다. 다음을 보자. 주석이 그 의미이다.
*pnum = 20; // 포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 int 값 20을 저장하라
printf("%d", *pnum); // 포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 저장된 값을 출력하라
예시를 통해 살펴보자
<소스코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
int main(void) {
int num1 = 50, num2 = 100;
int* pnum;
pnum = &num1; // 포인터 변수 pnum이 int형 변수 num1을 가리킴
(*pnum) += 30; // num1 += 30과 동일하다
pnum = &num2; // 포인터 변수 pnum이 int형 변수 num2를 가리킴
(*pnum) -= 30;
printf("num1 : %d\n", num1); // 50 + 30
printf("num2 : %d\n", num2); // 100 - 30
return 0;
}
|
cs |
<실행결과>
위의 결과를 그림으로 그려보면 다음과 같다.
예제
int형 변수 num1, num2를 선언과 동시에 각각 30, 20으로 초기화하고 int형 포인터 변수 ptr1, ptr2를 선언하여 각각 num1, num2를 가리키게 하자. 그 후 ptr1과 ptr2를 이용하여 num1의 값을 10 증가시키고, num2의 값을 10 감소시키자. 이제 두 포인터 변수 ptr1과 ptr2가 가리키는 대상을 서로 바꾸고 ptr1과 ptr2가 가리키는 변수에 저장된 값을 출력하라
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <stdio.h>
int main(void) {
int num1 = 30, num2 = 20;
int* ptr1, * ptr2;
// ptr1, ptr2가 num1과 num2를 가리키게 한다.
ptr1 = &num1;
ptr2 = &num2;
// ptr1과 ptr2를 각각 10 증가 10 감소
(*ptr1) += 10;
(*ptr2) -= 10;
// 두 포인터 변수 ptr1과 ptr2가 가리키는 대상 변경
int* temp;
temp = ptr1;
ptr1 = ptr2;
ptr2 = temp;
// 출력
printf("*ptr1 = %d\n", *ptr1);
printf("*ptr2 = %d\n", *ptr2);
return 0;
}
|
cs |
<실행결과>
'C' 카테고리의 다른 글
5. 포인터와 함수 (0) | 2021.06.25 |
---|---|
4. 포인터와 배열 (0) | 2021.06.22 |
2. 배열을 이용하여 문자열의 표현 (0) | 2021.06.21 |
1-1 배열 예제 (0) | 2021.06.21 |
1. 배열 - 배열과 초기화에 관하여 (0) | 2021.06.21 |