주소 연산자 &

 

C언어의 가장 중요한 개념이 포인터(&) 입니다.

 

물론 포인터 말고 다른 개념들도 중요하죠.

 

하지만 다른 언어와 C언어의 주요한 차이점에는 포인터(Pointer)를 말할 수 있을 것 입니다.

 

주소연산자는 & 기호를 사용합니다. 영어로는 앰퍼샌드, 혹은 앤드라고 말합니다.

 

포인터라는 거대한 시스템을 알기 위해서는 몇가지 기초지식이 필요하는데

 

솔직히 초보자들에게는 한번에 넘어가기 쉽지 않은 내용입니다.

 

많은 사람들이 컴퓨터에 대한 호기심과 부푼 꿈을 안고 C언어를 시작해서 포인터에서 좌절하고는 합니다.

 

저도 같은 경험을 했기 때문에 포인터를 잘 하고 싶다면 좀 더 세밀한 접근이 필요하다고 생각합니다.

 

프로그래밍을 하기 위해서는 성실히 하는게 중요하다고 강조를 하는데

 

포인터에 와서 보면 재능이 필요하다고 느끼게 되죠.

(죽도록 파거나 그냥 재능으로 하거나... 안타깝지만 그렇습니다. 코딩은 악기연주와도 비슷하니까요)

 

또 C언어가 아니라 다른 동적타입 언어(자바스크립트 등)들도 중급을 넘어서는 단계에서는 잘 풀리지 않는 문제들이 나옵니다.

 

어떤 언어라도 단계가 높아지면 어려워지는 것은 비슷합니다.

 

그냥 어려워지기만 하면 그래도 그 문제를 풀면 될 것 같은데, 학습량이 엄청나게 늘어납니다.

 

입문하기 쉽다고 하는 프론트엔드의 테크트리를 제대로 타려면 언어와 프레임워크를 10개 이상 마스터해야된다고 말하는 전문가들도 있습니다. (유럽 프로그래머 유튜피셜)

 

그러니까 기왕  C언어를 배워야 한다면 너무 스트레스 안받는게 좋습니다. 어떤 언어로 트리를 타더라도 위로가면 힘들어집니다. 어느 분야보다 기술 주기가 빠른 코딩은 지금 우리가 하고 있는 코딩의 형태가 미래에 어떤 모습으로 바뀔지 알 수 없습니다.

 

 

각설하고 & 연산자에 대하여 이야기하려 합니다.

 

&는 주소연산자입니다.

 

동적타입 언어에서는 다룰일이 없기 때문에 C언어로 나중에 넘어왔으면 개념의 정리가 필요합니다?

 

우리가 아는 메모리의 최소 단위는 0과 1, 즉 1비트입니다.

 

1비트를 운영체제에서 메모리 주소로 사용하지는 않습니다. 묶어서 가져오는 것입니다. 메모리의 주소를 메기는 것은 1비트를 8개 모은 바이트 단위로 사용합니다. 즉 1바이트에 하나의 주소를 할당합니다.

 

 

비주얼 스튜디오에서 아래 코드를 실행시키고 디버거를 열면 메모리가 배열된 숫자의 판(배열)을 볼 수 있습니다.

 

코드를 실행시켰을 때 메모리에 실제 존재하는 내용입니다.

 

실체가 있다고 해서 이것들을 '객체' 나 인스턴스라고 부르기도 합니다.

 

 

 

#include <stdio.h>

int main()
{
    Line;

    signed char myVar[5] = { 2, 4, 6, 8, 10 };

    printf("myVar : %2d address: %p\n", myVar[0], &myVar[0]);
    printf("myVar : %2d address: %p\n", myVar[1], &myVar[1]);
    printf("myVar : %2d address: %p\n", myVar[2], &myVar[2]);
    printf("myVar : %2d address: %p\n", myVar[3], &myVar[3]);
    printf("myVar : %2d address: %p\n", myVar[4], &myVar[4]);

    return 0;
}

 

실행결과 - 매번 메모리 위치가 바뀐다.

 

메모리를 보면 주소도 16진수로 표기하고 메모리의 값도 16진수로 표기되는데 익숙하지 않다면 자꾸 사용해서 익숙해지는 수밖에 없습니다.

 

왜 더 복잡하게 하느냐?

 

10진수로 표기하면 훨씬 복잡해집니다. char 는 1바이트이므로 16진수 2개로 나타낼 수 있습니다. 10진수로 표기하면 3자리를 써야합니다. 부호없는 바이트가 0~255 부호있는 바이트는 -128~127 인데 음수까지 2의 보수로 다 표현할 수 있습니다.

 

char 가 1byte 인 이유를 보면 많은 의미가 담겨있습니다. 왜 ASCII 코드가 char 인지 그런 부분들을 파고 들면 인사이트를 얻을 수 있을 것 입니다.

 

C에서는 1byte 를 byte라 쓰지 않고 char 즉 문자형으로 만들어 놔서 약간 혼동이 있습니다. 후에 확장문자를 지원하는 wchar_t 가 나오기도 했는데 그냥 1바이트 숫자형으로 봅니다.

 

포인트는

 

* 메모리는 1바이트 단위라는 것과

 

* 메모리의 주소를 16진수로 표기한다는 것

 

입니다.

 

주소연산자 & 가 하는 일은 메모리의 주소를 가져오는 일입니다.

 

아주 당연한 내용이지만 강조를 해봅니다.

 

기초적인 내용은 아래 포스팅들을 참고하면 될겁니다.

 

 

C언어 자료구조 - 배열의 구조

C의 대표적 자료 구조인 배열에 대하여 알아본다. 배열은 대부분의 언어에 기본으로 장착되어 있는 자료형태이다. 컴퓨터는 모든 데이터를 0과1의 이진 데이터의 형태로 저장한다. 이진법과 C의

digiconfactory.tistory.com

 

 

이진법과 2의 보수

이진법은 무엇인가? 아니 그 전에 십진법에 대해서 알아본다. 십진법은 누구나 알고 있는 진법이다. 십진법이라고 가르쳐주지 않아서 헷갈릴 뿐이다. 바로 이것이다. 왼손 새끼손가락부터 오른

digiconfactory.tistory.com

 

 

C언어 2 - 1 | 자료형 | char 형 변수의 사용

C언어의 자료형을 배워본다. 자료형은 무엇일까? 자료형을 논하기 전에 먼저 컴퓨터가 정보를 어떻게 다루는지 알아 봐야한다. 사람은 10진법에 익숙하지만 컴퓨터는 이진법으로 계산한다. 컴퓨

digiconfactory.tistory.com

 

주소연산자를 사용하면 이제 메모리에 직접 손을 댈 수 있습니다.

 

& 주소연산자의 사용을 C컴파일러는 막지 않기 때문에 함부로 막 사용하면 런타임에 무슨일이 생길지 모르니 신중하게 사용하도록 합니다.

 

런타임 오류가 나면 운영체제가 어느정도 막아주는데 아주 심각한 오류가 나면 컴퓨터에게 손상을 입힐 수 있으니 주의합니다. 자유도가 높다는 것은 그만큼 책임이 크다고 하는 것이 C의 정신이죠.

 

자바 이후 언어들에서 메모리를 사람이 관리하지 않도록 하는 것은 가상머신(JVM)이 관리하는게 낫다고 믿기 때문입니다. 또 크로스플랫폼을 위한 것도 있습니다. 리틀앤디안과 빅앤디안의 문제도 생기죠. (바이트를 저장하는 순서가 다름)

 

&과 관련하여 알아야 할 점은...

 

변수는 두개의 값을 가지고 있습니다.

 

1. 메모리 주소와

 

2. 메모리 안에 들어있는 값입니다.

 

int myNumber = 10;

 

을 보면 &myNumber 라는 메모리 주소와 10이라는 값이 있습니다.

 

myNumber 라는 문자열은 컴파일된 C코드에 없습니다.

 

주소값만 있으면 되니까 변수의 이름은 필요없습니다. 사람이 코딩할 때 필요할 뿐이죠.

 

변수를 이름이 아니라 주소라는 시각으로 접근하면 주소연산자 & 도 이해되고 포인터도 이해됩니다. 

 

여기까지가 포인터를 시작하기 위한 출발점입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band