C언어가 있는 이유는 단언컨대 포인터 때문이라고 할 수 있습니다. 이제까지 변수를 선언함으로써 메모리 안에 있는 공간을 확보한 후에 그곳에 데이터를 넣고 쓰는 공간으로 사용했습니다. 하지만 포인터를 사용하게 되면 메모리의 주소를 저희가 직접 조작을 할 수 있습니다. 그러나 포인터를 잘못 사용하게 되면 중요한 메모리가 날아갈 수 있으니 그 부분은 조심해야 합니다.
주소 연산자&(ampersand)
위에서 변수가 메모리 안에 있는 공간을 확보 후 그곳에 데이터를 집어넣은다고 했습니다. 하지만 그 메모리의 주소를 저희는 직접 알아본 적이 없습니다. 변수의 메모리 주소를 알려면 변수명 앞에 &(ampersand)를 붙이면 됩니다. 그렇다면 직접 주소를 알아보겠습니다.
#include <stdio.h>
int main(void){
int a;
printf("%d", &a);
return 0;
}
int형으로 a를 선언했고 printf를 통해서 a의 주소를 알아봤습니다. 저는 값이 187694797가 나왔습니다. 하지만 컴퓨터에서 주소는 16진법으로 표현되어야 맞기 때문에 16진법으로 표현방식을 고쳐보겠습니다.
6 fdff408이라는 값이 잘 나와줬습니다. 이게 변수 a의 주소입니다. 참고로 int형 변수는 4바이트입니다. 그중 제일 앞 주소가 표현이 된 것입니다. 이제 이 메모리 주소를 활용해서 포인터를 사용해보겠습니다.
포인터 선언 *(asterisk)
포인터를 선언하려면 포인터 변수 앞에 *만 붙여주면 됩니다.
#include<stdio.h>
int main(void){
int a;
int *pa;
pa = &a;
*pa = 1000;
printf("a의 값은 %d입니다.\n", a);
printf("포인터 pa의 값은 %d입니다.\n", *pa);
return 0;
}
포인터를 선언할 때도 변수와 마찬가지로 앞에 변수의 형태를 적어주셔야합니다. 저는 int형 a를 참조하는 포인터를 만들기 때문에 int형을 선언해준 후 포인터(*) pa라는 변수를 선언해줬습니다. 그리고 pa = &a에서 헷갈리시는 분들이 많을 텐데(제가 헷갈렸습니다) 왜 *pa = &a가 아닌 pa = &a일까라는 의문이 드는 분들이 많을 겁니다. 간단하게 생각해서 변수의 주소를 대입할 때는 *을 빼고 적으시고 똑같은 포인터끼리 할 때는 *를 붙여주시면 됩니다. 처음에 포인터를 배울 때는 많이 헷갈리지만 다양한 경우에서 사용해보면 나중에는 헷갈리지 않고 잘 사용하실 수 있을 겁니다.
'C' 카테고리의 다른 글
C언어 함수(function) (0) | 2022.02.02 |
---|---|
C언어 반복문 (for, while, do while) (0) | 2022.01.31 |
C언어 switch / case 사용 방법 (0) | 2022.01.17 |
C언어 if문 (0) | 2021.12.26 |
C언어 연산자(관계연산자 / 논리연산자) (0) | 2021.12.21 |
댓글