본문 바로가기
C

C언어의 꽃 포인터

by 규우울 2022. 2. 4.
반응형

C언어가 있는 이유는 단언컨대 포인터 때문이라고 할 수 있습니다. 이제까지 변수를 선언함으로써 메모리 안에 있는 공간을 확보한 후에 그곳에 데이터를 넣고 쓰는 공간으로 사용했습니다. 하지만 포인터를 사용하게 되면 메모리의 주소를 저희가 직접 조작을 할 수 있습니다. 그러나 포인터를 잘못 사용하게 되면 중요한 메모리가 날아갈 수 있으니 그 부분은 조심해야 합니다.

 

주소 연산자&(ampersand)

위에서 변수가 메모리 안에 있는 공간을 확보 후 그곳에 데이터를 집어넣은다고 했습니다. 하지만 그 메모리의 주소를 저희는 직접 알아본 적이 없습니다. 변수의 메모리 주소를 알려면 변수명 앞에 &(ampersand)를 붙이면 됩니다. 그렇다면 직접 주소를 알아보겠습니다.

#include <stdio.h>

int main(void){
    
    int a;
    printf("%d", &a);
    return 0;
}

int형으로 a를 선언했고  printf를 통해서 a의 주소를 알아봤습니다. 저는 값이 187694797가 나왔습니다. 하지만 컴퓨터에서 주소는 16진법으로 표현되어야 맞기 때문에 16진법으로 표현방식을 고쳐보겠습니다.

xcode를 사용해서 int형변수 a의 주소를 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

댓글