c언어 포인터 맛보기
네 안녕하세요, 이번 포스팅에서는 c언어에서 사용하는 변수인 포인터에 대하여 알아보도록 하겠습니다.
포인터는 메모리의 주소를 가지고 있는 변수인데, 실제로 코딩을 할 때 우리는 참조를 하는 경우가 많기 때문에 포인터를 많이 쓰게 됩니다.
그래서 정말 중요한 변수이기도 하고요.
그래서 이를 자세히 들여다보기 전에 간단하게만 보고 넘어가려 합니다.
그럼 지금부터 시작하도록 하겠습니다.
1. 주소 연산자 '&'
우리가 사용하는 포인터 변수는 메모리의 주소 값을 불러옵니다.
그중에 하나는 우리가 이미 쓰고 있었습니다.
바로 엠퍼센드(&)입니다.
우리가 scanf() 함수나 scanf_s() 함수를 쓸 때 쓰곤 했죠?
그리고 여기서 쓰는 엠퍼센드가 주소를 불러오는 기능을 한다고 말이죠.
그래서 그럴 한 번 상기시키기 위해서 한 번 간단한 예제를 작성해보도록 하겠습니다.
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
double c = 1.1;
printf("a의 주소 : %u\n", &a);
printf("a의 주소 : %u\n", &b);
printf("a의 주소 : %u\n", &c);
return 0;
}
여기에서 처음 보는 게 있을건데, %u입니다.
우리가 정수형 자료형을 받을 때는 크게 3가지를 씁니다.
- %d : 부호가 있는 정수형 자료형
- %i : %d와 동일
- %u : 부호가 없는 정수형 자료형
이렇게 쓰는데, 이렇게 받을 수도 있다는 걸 알려드리고 싶어서 한 번 써봤습니다.
그럼 결과를 보도록 하겠습니다.
a의 주소 : 6422300
a의 주소 : 6422296
a의 주소 : 6422288
이 주소 값은 컴퓨터마다 다릅니다.
2. 포인터 선언 방법
우리가 포인터를 쓸 때는 이런 식으로 씁니다.
int *a;
이 에스터리스크(*) 역시 포인터인데요,
이는 간접 참조 포인터라고 부릅니다.
이는 나중에 좀 더 자세히 다루도록 하겠습니다.
여하튼 이렇게 쓰게 되면 int형 자료형 a의 주소 값을 간접참조를 하겠다는 뜻이 됩니다.
그래서 a의 주소값을 불러와서 쓸 수가 있는 거죠.
그리고 엠퍼센드 역시 변수 앞에 붙었죠?
다 그렇게 붙는다고 보면 됩니다.
그리고 어떤 자료형이든 다 붙을 수 있습니다.
3. 포인터의 초기화
이 포인터 역시 초기화를 시킬 수 있습니다.
포인터를 초기화하는 방법은 변수를 초기화시키는 방법과 비슷하지만 조금 다릅니다.
int *a = (int *)10;
이렇게 씁니다.
여기서는 주소 값을 초기화시키는 것이기 때문에 특정 번지의 주소를 지정하여 초기화를 시킨다는 뜻입니다.
그리고 이러한 방법은 특히 아두이노나 라즈베리 파이와 같은 하드웨어에 관련된 소프트웨어를 개발할 때 정말 많이 씁니다.
그래야 특정 번지에 해당하는 부분만 동작을 시킬 수가 있기 때문입니다.
하지만 하드웨어 개발자라면 이렇게 쓸 수 있겠지만,
소프트웨어만 하는 웹이나 앱 개발자라면 이렇게 쓰면 안 됩니다.
그 이유는 운영체제가 메모리를 관리하고 있기 때문에 위와 같은 절대 주소 값을 대입하는 방법은 절대로 피해야만 합니다.
그래서 우리가 계속 써오던 엠퍼센드를 붙여서 받아줍니다.
이렇게 말이죠.
int i = 10;
int *a;
a = &i;
이렇게 써서 연결을 해주는 겁니다.
이 주소는 제가 앞서 언급했듯이 번지수의 값, 다시 말해서 인덱스 넘버입니다.
그래서 인덱스 넘버를 가져와 적용을 하는 것입니다.
예를 들어서 변수 i의 인덱스 값이 3이라 한다면,
포인터 변수 a는 i의 주소 값인 3을 받아와서 10이라는 수를 표현할 수 있게 되는 것이죠.
그러면 주소를 받아보는 연습을 위한 간단한 코드를 한 번 작성을 해보도록 하겠습니다.
#include <stdio.h>
int main()
{
int a = 1;
double b = 11.1;
int *i = NULL;
double *j = NULL;
i = &a;
j = &b;
printf("%u %u\n", i, &a);
printf("%u %u\n", j, &b);
return 0;
}
이렇게 작성을 했습니다.
이제 주소 값이 똑같이 나오는지 한 번 봅시다.
6422292 6422292
6422280 6422280
간접 참조를 한 변수 i와 일반 변수 a의 주소 값, 그리고 간접 참조 변수 j와 일반 변수 b의 주소 값이 정확히 일치하는 것을 불 수가 있습니다.
그리고 이 역시 컴퓨터마다 주소 값은 다르기 때문에 여러분들의 컴퓨터에 뜨는 값을 보시면 됩니다.
여기까지 포인터에 대하여 간단하게 알아보았는데요,
다음 포스팅에서는 간접 참조 연산자인 에스터리스크(*)에 대하여 알아보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다 ~
'c언어' 카테고리의 다른 글
c언어 포인터 사용 시 주의할 점에 대하여 알아보기 (0) | 2022.12.07 |
---|---|
c언어 간접 참조 연산자 알아보기(*, &) (0) | 2022.12.07 |
c언어 배열을 이용하여 여러 가지 문제 풀기(주사위 던지기, 극장 예약 시스템 제작하기, 최솟값 찾기, 영상 처리하기, 틱텍토(tic-tac-toe) 게임 만들기) (0) | 2022.12.07 |
c언어 2차원 배열에 대하여 알아보기 (0) | 2022.12.07 |
c언어 탐색 알고리즘에 대하여 알아보기 (0) | 2022.12.07 |
댓글