C언어의 기초 문법

포인터 변수와 주소값; 참조와 역참조

 자 일단 제목은 무서워 보입니다. 네. 포인터는 아주 무서운 놈이죠. 불가능을 가능으로 만드는 장점은 있지만, 우리 뇌를 어지럽게 만드는 단점도 있습니다

 일단 포인터 변수에 대해서 알아볼게요

int *p

자... 여기서 또 무서운 게 나오죠. 갑자기 변수 앞 p에 별*이 붙었습니다. 이 별은 곱하기의 *이 아니라 이 p라는 변수가 포인터 변수라는 뜻입니다. 그럼 선언 방법을 알아봤으니 어떻게 이용하는지 알아볼까요?

int a, *pa;
pa = &a;
*pa = 100;
printf("%d", a);
// result: 100

여기에서 또 이상한 부분이 나옵니다. &a가 갑자기 또 왜 나오죠? 제가 예전에 설명을 안 드렸었는데, 이 &는 '참조 연산자'; 주소값 연산자입니다. 모든 변수는 컴퓨터 안에 있는 데이터베이스에 저장되어 있습니다. 필요할 때는 그걸 꺼내서 사용하는 것이죠. 그런데, 이 변수에는 다 번호가 있습니다. 그러니까 저장 번호 같은 것이죠. 그게 바로 주소값입니다. 포인터 변수는 주소값을 가지고 있는 변수입니다. 그래서 그냥 pa를 놓고 값을 구하려면 주소값을 넣어줘야겠죠. &a는 '변수 a의 주소값'을 뜻합니다. 그러니까 포인터 변수 pa는 a의 주소값을 가지고 있게 되는 것이죠. 이 때 *pa가 100이라고 하면 이 *은 '역참조 연산자'입니다. 그러니까 pa가 가지고 있는 주소값에 *을 붙이게 되면 그 변수의 값; a의 값을 뜻하게 되는 거죠(어렵죠? 네, 이해합니다). 이렇게 해서 a의 값을 100으로 정하고 출력하는 것입니다. 아주 복잡합니다. 그런데 이걸 이용하면 함수에서 call by reference(다른 함수의 지역변수 조종하기)를 할 수 있습니다. 그건 다음 시간에 알려드릴게요. 그런데 여기는 너무 복잡하고 어려워서 조금 복습을 하시고, 실제로 프로그램도 짜보시면서(TMI: 저는 Visual Studio보다는 Code Blocks를 추천합니다. 자세한 건 인터넷에 다 있어요) 다음으로 오시기 바랍니다^^;

댓글

댓글 본문
  1. Joel
    제가 지금 5학년이여서 집합에 대해서는 모르겠는데, pa는 a의 주소값을 가지고 있습니다. a의 주소값을 저장하여 그 주소값을 타고 변수 a를 조종할 수 있는 것입니다. 그러니까 *pa는 a와 다를 것이 없다는 것이죠. 그 말은 값이 두 개까지 중복으로 들어갈 수 없습니다.
  2. 고라니 삼촌
    a가 100의 주소 값을 받는다고 했을 때 그건 100이 아니라 100의 주소 값이니까 값이 두개 까지 중복으로 들어갈 수 있냐는 그런 뜻이 맞습니다. 질문을 이렇게 한게 맞습니다. 다시 설명하자면 포인터로 쓰이는 변수에 들어가는 주소값이 수학으로 치면 전체집합이라는 의미로 생각해도 되냐는 거에요. 모든 집합은 전체 집합이 먼저 존재해야 존재 가능하니까요
    대화보기
    • Joel
      문제 뜻이 잘 이해가 안 되긴 하는데, a 안에는 여러 개의 숫자가 들어갈 수 없습니다. 제가 이해를 잘 못 해서 답해드릴 수가 없네요;;; 더 자세히 설명해 주시면 좋을 것 같습니다.
    • 고라니 삼촌
      아 그러면 여기서 또 질문인데요 a의 100이 된다는 얘기가 a안에 여러 개 숫자들이 더 들어갈 수 있나요
      아니면 다른 숫자 하나가 들어올 수 있게 어떤 변수 하나의 주소 값을 발판 용도로 해서 다른 정수가 그 발판위에 온다고 만 알면 됩니까
      대화보기
      • 고라니 삼촌
        감사합니다.
        대화보기
        • Joel
          네! 정확합니다. 더 자세히 예기하자면 pa라는 변수는 a의 주소값을 "참조"하는 것이고, *을 붙이면 그건 a의 주소값을 "역참조"하는 것입니다. 그러니까 역으로 a의 주소에 찾아가서 a의 값을 변하게 한다는 것이죠
          대화보기
          • 고라니 삼촌
            댓글이 맞게 이해 한건지 검토 부탁 드립니다.
            대화보기
            • 고라니 삼촌
              이해 잘했습니다
              그래서 한번 검토 받고 싶은데요

              포인터란 요약하자면 변수 하나랑 포인터 변수 란거 하나를 선언 했다고 하면 pa변수에 a라는 변수의 주소를
              저장하고 다음꺼는 pa에 *표를 붙여서 값을 100대입하면 pa가 원래 a의 주소 값을 가지고 있으니 들어간 100은 a의 100이 된다는 말씀인가요??
            • Joel
              질문할 것이 있다면 질문해 주세요^^ 포인터는 어려운 거라 그럴 수 있습니다;;
            graphittie 자세히 보기