본문 바로가기

프로그래머, 보안 관련 지식/자료구조

자료구조 시작전 알기 (3) CPU-Memory Architeture, Variables ,Addresses, Pointers

지난 포스터에서는 변수와 포인터에 대해 알아보았다. 이번 포스터에서 포인터 관련해서 좀 더 다루어보자.

아래 코드를 보자

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main()
{
 
int a, x;
char b;
 
int *p, *r;
int **q;
 
= &a; *= 30; q= &p; **= 30;
 
= a + *p;
 
    return 0;
}
 

14 번째에서 x = a + *p가 허용이 될까? 한번 생각해보자

 

a 는 int 값을 가진 변수이다. 그리고 *P는 무슨 뜻이였는가? p주소로 가라는 뜻이다. 거기에 가면 뭐가

있는가? 9번째에 우리는 int *p라고 선언했다. p번지로 가면 int 값이 있다는 것이다.

 

그러면 a+*p 는 두개의 int형 변수를 더하는 것으로 아무런 문제가 될것이 없다.

즉 허용된다는 이야기이다.

 

그러면 다른 예시도 생각해보자

위의 코드를 바탕으로 해서 

p = p + r  를 선언했다고 하자. 이것은 허용이 될까? 이것은 허용이 되지 않는다

 

p는 주소값이다. r은 마찬가지로 주소값이다. 주소+주소를 한것이다.

 

예를 들어 600번지와 700번지를 더하면 1300번지가 된다. 이러한 더하기를 해서 나온값은

어떠한 의미도 갖지 않기 때문에 허용하지 않는다.

 

그럼 반대로 p = p - r 은 허용이 될까? 앞의 더하기는 허용이 되지 않았으니 빼기도 마찬가지로 

허용되지 않을거라고 생각할것이다. 그러나 놀랍게도 이것은 허용이 된다.

 

아니 덧셈은 허용하지 않고 뺄셈은 허용이 되다니 그렇담 주소 - 주소가 어떠한 의미를 가진다는 말인가?

 

그렇다 주소의 뺄셈은 약간의 의미를 가지고 있다.

 

왜 그런지 살펴보자. 

예를들어서 주소가 700번지에서 400번지를 빼본다고 생각하자. 300번지가 나올것이다. 이게 무슨 의미일까? 서로 300ㅂ번지만큼 떨어져 있다는 뜻이다. 컴퓨터에서 우리의 주소와는 다르게 연속되는 값으로 붙어있기 떄문에

주소-주소 값은 거리가 된다.

 

그런 의미에서 p = p + 3도 허용이 된다. p의 주소에서 옆으로 3칸 움직였다라는 뜻이 된다.

p 가 int변수이기 때문에 3바이트 떨어진다는 뜻이 아니라 int 3개 만큼 옆으로 움직인다는 뜻이 된다.

 

이렇게 해서 포인터까지 자료구조 시작전에 중요 내용들을 알아 보았다.

 

다음 포스터에서는 자료구조에 본격적으로 들어가기에 앞서 알고리즘의 정확성, 속도에 대해 알아보자