포인터 문법 *

포인터 문법을 알아보겠습니다.

 

지난 포스팅에서 주소연산자를 알아봤습니다.

 

주소연산자 &가 메모리의 주소를 리턴하는 것이라면 포인터연산자 * 는

 

&로 가져온 값에 접근할 수 있는 연산자입니다.

 

 

주소 연산자 & | C언어 마스터 가이드 7

주소 연산자 & C언어의 가장 중요한 개념이 포인터(&) 입니다. 물론 포인터 말고 다른 개념들도 중요하죠. 하지만 다른 언어와 C언어의 주요한 차이점에는 포인터(Pointer)를 말할 수 있을 것 입니

digiconfactory.tistory.com

 

포인터는 변수의 주소값을 할당함으로써 초기화합니다.

 

포인터 이전에 변수를 먼저 만들어야 합니다.

 

int myVar = 7;

 

변수를 만들면 이 변수의 주소를 주소연산자 &를 사용해서 포인터에게 할당합니다.

 

int *myPtr;

 

포인터를 선언하고

 

myPtr = &myVar;

 

의 형식으로 포인터에 할당합니다.

 

지난 포스팅에서 변수에는 주소와 값 두가지 데이터가 있다고 했습니다.

 

포인터에게 할당하는 것은 그 중에 주소입니다.

 

이렇게 가리키는 것입니다. (문법이 아니라 데이터가 가는 방향입니다)

 

myPtr --> &myVar

 

포인터연산자 *를 사용하면 값을 가리킵니다. *를 간접연산자 혹은 역참조라고 합니다.

 

*myPtr --> myVar

 

이런 모습이지만 실제로는 

 

*myPtr --> &myVar --> myVar

 

주소를 거쳐야 값을 가져오겠죠?

 

주소를 알아야 값에 접근하기 때문에 주소값을 가지고 있는 것 입니다.

 

#include <stdio.h>

#define Line printf("------------------------\n")

int main()
{
    Line;

    int myVar = 7;
    int* myPtr = &myVar;

    printf("  myVar : %d, address: %p\n", myVar, &myVar);
    printf(" *myPtr : %d, myPtr:   %p\n", *myPtr, myPtr);

    return 0;
}

 

자, 이제 보면 헷갈립니다.

 

* 하고 & 기호가 막 나오기 시작하고 어떤 것은 ( ) 괄호도 치고 ** 두개쓰고 이러다 보면 처음엔 쉬운 것 같은데 점점 빡치게 되죠. 다들 그렇습니다. 너무 스트레스 받을 필요는 없어요.

 

다음 단계로 가기 전에 기본문법을 완벽하게 몸에 익히는게 좋습니다. 그러기 위해서는 이해하고 실제로 코딩해보고 다시 돌아와서 한번 더 이해하고 단계별로 전부 이해하는 식의 방법이 좋습니다.

 

포인터를 연습하는 것에 조금 시간을 더 투자하는게 나중을 위해 좋습니다.

 

*myPtr = 30;

위 코드에서 역참조값을 변경하면 원본 myVar 의 값도 변경됩니다. 즉 값은 하나입니다.

 

값은 하나이고 가리키는게 두개라는 말도 됩니다. 하나는 원본 자신이고 두번째는 포인터로 가리키는 것이죠.

 

원본의 값을 바꾸건 포인터로 역참조를 바꾸건 값은 하나기 때문에 다 바뀌는 것 입니다.

 

    printf(" *myPtr : %d, myPtr:   %p, &myPtr: %p\n", *myPtr, myPtr, &myPtr);

 

위 코드는 한가지를 더 보여줍니다.

 

바로 포인터 자신도 주소가 있다는 것입니다.

 

왜냐하면 포인터도 변수이기 때문입니다.

 

포인터를 포인터 변수라고 합니다.

 

 

주소를 보면 다릅니다. 

 

위에서 보면 지금 포인터는 32비트의 값을 가지고 있습니다. 그래서 32비트 주소를 액세스 할 수 있습니다.

 

한 시스템에서 모든 포인터가 가질 수 있는 값의 범위는 동일합니다. 32비트 주소라면 32비트가 필요하고 64비트는 64비트 주소값이 들어가야 합니다.

 

그렇다면 포인터를 선언할 때 int * 이것은 무엇이냐?

 

역참조를 위한 선언입니다. 역참조를 할 때의 형태를 확인해야 하기 때문입니다.

 

int 형인지 double 인지 혹은 char 인지에 따라 역참조를 가져왔을 때 연산이 달라지겠죠?

 

또 하나는 배열을 사용할때 자료단위를 이동하기 위해서 필요합니다. int 는 4바이트이므로 +1에 4바이트를 이동합니다.

 

그래야 배열에서 다음 값을 제대로 가져올 수 있습니다.

 

4바이트 배열에 2바이트씩 값을 가져온다면 데이터를 사용할 수 없습니다.

 

 

포인터 문법 * 는 이정도로 충분할 것 같습니다.

 

나머지는 본인이 얼마나 열심히 연습하냐에 달려있겠습니다.

 

한국에서는 포인터를 하는 사람만 열심히 하는 것 같은 기분도 드는데 뭐 모르겠습니다.

 

다른 언어들이 더 화려하고 결과물도 빨리나오는 것이 사실이니까요.

 

C언어로 어떤 결과물을 만드는 것은 어렵지만 컴퓨터의 베이스를 까는데는 최고입니다.

 

해서 C언어 학습의 목적이 C프로그램의 제작이라면 그건 참 험난한 일인텐데요,

 

컴퓨터구조를 마스터한다는 느낌으로 달려든다면 큰 의미가 있습니다.

 

이걸 하고 자바나 동적타입(파이썬, 자바스크립트)에 넘어가면 생각의 속도가 다릅니다.

 

소림사가면 기초 체력같은거 기르는 거랑 비슷하다고 보시면 됩니다.

 

외국에 어떤 유튜버는 어셈블리어를 다시 배워야 한다고 하던데;;;

 

것도 맞는 말이지만 C언어가 어셈보다는 낫다고 할 수 있겠죠? 일단 어셈은 처음에 독학이 매우 어렵습니다. C++을 하다 보면 인라인 어셈 정도는 배우게 됩니다. 그 정도만 해도 충분하죠.

 

언어를 배우고 어떤 방향성을 추구하는 것은 사람마다 다른 선택입니다.

 

아마 그게 프로그래밍을 단순한 공장에서 찍어내는 제품이 아니라

 

예술의 경지로 만드는 이유라고 볼 수 있습니다.

 

코딩 좋아하는 사람들은 뭐 코딩은 예술이다, 음주와 코딩은 잘 맞는다 이런 이야기도 하는데

 

코딩에 갬성도 들어갑니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band